5

時代遅れの Ant ビルドを Gradle に変換しようとしています。このプロジェクトには、約 50 の Java サブプロジェクトと 10 の Scala サブプロジェクトが含まれています。Java プロジェクトには Java のみが含まれ、Scala プロジェクトには Scala のみが含まれます。各プロジェクトは Java で構築され、次に Scala で構築されるため、構築が大幅に遅くなります。

次のように、ルートの build.gradle ファイルにできるだけ多くの共通ロジックを配置したいと考えています。

subprojects {
    apply plugin: 'java'
    apply plugin: 'scala'

    sourceCompatibility=1.7
    targetCompatibility=1.7

    sourceSets {
        main {
            scala {
                srcDir 'src'
            }
            java {
                srcDir 'src'
            }
        }
        test {
            scala {
                srcDir 'test'
            }
            java {
                srcDir 'test'
            }
        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        scalaTools "org.scala-lang:scala-compiler:2.9.3"
        compile "org.scala-lang:scala-library:2.9.3"
    }

    // Use the sbt compiler (not scalac ant task)
    tasks.withType(ScalaCompile) {
        scalaCompileOptions.useAnt = false
    }

    task showCompileClasspath << {
       sourceSets.main.compileClasspath.each { println it }
    }

    test {
        systemProperty "user.dir", projectDir
    }
}

ビルドを実行すると、次の出力が得られます。同じ警告が含まれていることに注意して:esb-server:compileJavaください:esb-server:compileScala。そのため、クラスが 2 回ビルドされています。compileJavaまた、他のすべてのプロジェクトにはとが含まれていることに注意してください。compileScala

:common:assemble
:esb-server:compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:esb-server:compileScala
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:esb-server:processResources UP-TO-DATE
:esb-server:classes
:esb-server:jar
:esb-server:assemble
:plugins:compileJava UP-TO-DATE
:plugins:compileScala UP-TO-DATE
:plugins:processResources UP-TO-DATE
:plugins:classes UP-TO-DATE
:plugins:jar
:plugins:assemble
:raas-transform:assemble
:saxonee-helper:assemble
:scala-common:compileJava UP-TO-DATE
:scala-common:compileScala
/Users/iain.hull/code/trunk/ccdev/scala-common/src/com/workday/esb/assembly/audit/TreeAudit.scala:138: method first in trait IterableLike is deprecated: use `head' instead
    override def getLast():Option[AuditNode] = if (children.isEmpty) None else children.first.getLast
                                                                                        ^
one warning found
:scala-common:processResources UP-TO-DATE
:scala-common:classess
:scala-common:jar
:scala-common:assemble
:plugins:hibernatepersistence:compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:plugins:hibernatepersistence:compileScala
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:plugins:hibernatepersistence:processResources
:plugins:hibernatepersistence:classes
:plugins:hibernatepersistence:jar
:plugins:hibernatepersistence:assemble

apply pluginルートの上部にある 2 つの行build.gradleがこの動作を引き起こしていることはわかっています。ただし、各サブプロジェクトに正しいプラグインのみを適用すると、共通の構成をルートにリファクタリングできませんbuild.gradle。別のアプローチは、すべてに Scala プラグインを使用することですが、これが最善の方法ですか?

Java プラグインを使用して Java プロジェクトをコンパイルし、Scala プラグインを使用して Scala プロジェクトをコンパイルし、すべてのプロジェクトで共通のビルド構成をルートにリファクタリングできますbuild.gradleか? Gradle でこのような複数の言語をサポートする最良の方法は何ですか?

4

1 に答える 1

5

このようなものはどうですか:

configure(subprojects.findAll {project  ->
    file('src/main/java').exists()
}) {
    apply plugin: 'java'
}

configure(subprojects.findAll {project  ->
    file('src/main/scala').exists()
}) {
    apply plugin: 'scala'
}

ソース ディレクトリはsrcであるため、クロージャ内に他の識別機構が必要です。

于 2013-04-05T08:55:10.943 に答える