0

これは Buildr では単純なタスクのように思えますが、機能させることができないため、明らかな何かが欠けているに違いありません。次のように、2 つのファイルを含むディレクトリがあるとします。

test/lib/src/main/scala/MyLib.scala
test/app/src/main/scala/MyApp.scala

MyLib.scalaは:

class MyLib {
  def hello() { println("Hello!") }
}

そしてMyApp.scala、次のとおりです。

object MyApp extends App {
  val ml = new MyLib
  ml.hello()
}

これらを構築するのscalacは簡単です:

$ cd test
$ scalac lib/src/main/scala/MyLib.scala -d target/main/classes
$ scalac app/src/main/scala/MyApp.scala -cp target/main/classes -d target/main/classes
$ cd target/main/classes/
$ scala MyApp
Hello!

Buildfileただし、これを(testフォルダー内の)に変換しようとする私の素朴な試み:

require 'buildr/scala'

lib_layout = Layout.new
lib_layout[:source, :main, :scala] = 'lib/src/main/scala'
app_layout = Layout.new
app_layout[:source, :main, :scala] = 'app/src/main/scala'

define 'mylib', :layout => lib_layout do
end

define 'myapp', :layout => app_layout do
  compile.with project('mylib')
end

次のエラーで失敗します:

(in /test, development)
Building mylib
Compiling myapp into /test/target/main/classes
/test/app/src/main/scala/MyApp.scala:2: error: not found: type MyLib
  val ml = new MyLib
               ^
one error found
Buildr aborted!
RuntimeError : Failed to compile, see errors above

実行すると、失敗の理由はクラスパスに含まれていないためであることはbuildr --trace明らかです。scalactarget/main/classes

どうすればこれを実現できますか? 2 つのプロジェクトを分離するのは不自然に思えるかもしれませんが、もっと洗練されたものを念頭に置いており、この例では問題をその本質的な構成要素にまで煮詰めました。

4

2 に答える 2

1

Buildrでプロジェクトを説明する慣用的な方法は、サブプロジェクトを使用することです。

注:buildfile以下はtest/ディレクトリに入ります。

require 'buildr/scala'

define "my-project" do
  define "lib" do
  end

  define "app" do
    compile.with project("lib").compile.target
  end
end

2つのサブプロジェクトlibappは自動的にlib/app/サブディレクトリにマッピングされ、Buildrはそれぞれの下にあるソースを自動的に検索しますsrc/main/scala

于 2012-09-24T16:55:32.640 に答える
0

プロジェクトレイアウトのビルダーの一般的な規則は、とでコンパイルされたクラスを探しtarget/classesますtarget/test/classes。あなたのビルドがクラスを次の場所に配置しているようtarget/main/classesです:

したがって、scalaパラメータを予想される場所に変更するか、レイアウトを変更して次のものを含める必要があります。

lib_layout[:target, :main, :scala] = 'target/main/classes'

テストクラスのレイアウトも変更する必要がある場合(私はあなたが変更しないと思います)、次を使用します。

lib_layout[:target, :test, :scala] = ...
于 2012-09-22T17:24:27.290 に答える