7

SBT(まったく新しいツール)を使用してボイラープレートを生成しようとしています。タスクのメインリファレンスとして、シェイプレスsbtファイル使用しています。このプロジェクトではコード生成を最初から使用しているのを見てきましたが、別のクラスからいくつかのクラスを生成したいので、私の場合は少し異なります。そのために、新しいScala2.10.0-M4リフレクション機能を使用するふりをします。SBTビルドからリフレクションを利用できるようにするには、どのような基本構成が必要ですか?

今のところ、sbtはscala.reflect.runtime.universeパッケージを見つけることができず、問題の原因が新しいScala jar分割によるものなのか、それとも不適切な構成によるものなのかはわかりません。その上、私のsbt言う:

[info] This is sbt 0.13.0-20120530-052139
[info] The current project is {file:/home/jlg/sandbox/abc/}abc
[info] The current project is built against Scala 2.10.0-SNAPSHOT
[info] 
[info] sbt, sbt plugins, and build definitions are using Scala 2.9.2

ちなみに、SBTを使ってソースコードを生成している他のプロジェクトを知っている人はいますか?

4

2 に答える 2

3

現在のSBTリリースはScala2.9に基づいており、ソースコードの生成は同じライブラリを使用してSBTと一緒に実行されます。基本的に2つの選択肢があります。

  • 非常に最先端である:Scala 2.10で実行されているSBTリリースを入手するか(0.13ブランチでも実行されない)、またはそれを待っています。最大の問題は、SBTを自分で再コンパイルする必要があるということだけでなく、Scala2.10に必要なすべてのSBTプラグインを再コンパイルすることです。長期的には、これはあなたが求めることを行うための最良の戦略かもしれませんが、今のところ大変な努力になるかもしれません。ただし、コード生成はコンパイル前に行われることになっているため、悪意のあるトリックなしでコンパイル済みコードにリフレクションを使用することはできないことに注意してください。それを行う必要がある場合は、代わりにプログラム内のコンパイル時にコードを生成することを検討してくださいマクロを使用します。これはSBTを除外し、はるかに標準的ですが、このリリースで完全なクラスを生成できるかどうかはわかりません(これは将来的に計画されていると思います)。
  • 古いものを使用する:Scala 2.9に固執し、コンパイル時の反映にscalapの機能(ScalaSigParser)を使用します。問題は、APIが異なり(どれほど深くはわからない)、実際には一般向けにサポートされていないことですが、さまざまな人々が長年にわたってAPIを使用しています。私が実行しているプロジェクトの場合、同僚がアプローチを実装し、それをプロジェクトのSBTに統合しました(https://github.com/ps-mr/LinqOnSteroids/)。その上、Scalateを使用して、コード生成に使用するテンプレートを作成します。これは非常に強力です。特にbuild.sbtを参照してください。これは、 project/Generator.scalaおよびproject/src / main / scala / ivm /generation / ScalaSigHelpers.scala(の一部の非完全汎用ラッパーScalaSigParser)を呼び出します。生成されたコードのスケーレートテンプレートは src / main / resources、ここで最も関連性のあるのはsrc / main / resources/WrappedClassInlined.sspです。さらに多くのことが関係しているので、実際にチェックアウトして、それが正確に何をするのかを確認する必要があるのではないかと心配していますが、気軽に質問してください。

コードはBSDライセンスで保護されているため、コードをコピーする場合は元の著作権を保持する必要があることに注意してください。

注:すべてのリンク(ライセンスを除く)は、安定性のために現在のHEADへのリンクであるため、将来のバージョンでファイルを移動/削除しても、簡単に消えることはありません。

于 2012-07-27T01:14:04.793 に答える
1

2.10.0-SNAPSHOTを使用している場合は、を選択する必要がありますscala.reflect.runtime.universe。詳細については、http://dcsobral.blogspot.ch/2012/07/json-serialization-with-reflection-in.htmlをご覧ください。

于 2012-07-17T19:41:53.073 に答える