1

私はgradleについて多くの良いことを読んだので、感銘を受けました. 多くの人が、gradle で開発するのがいかに簡単であるかに熱心です。それらはすべて、gradle のマルチプロジェクト機能を強調しています。

いくつかのサブプロジェクトを含むメイン プロジェクトが既にあります。外部の依存関係は、すべてのプロジェクト独自の ivy.xml で定義されています。また、モジュールの相互依存関係は、Eclipse の .classpath ファイルと ant build.xml の両方で並行して定義されています。このようにして、IDE 用にビルドし、ant でランタイムを作成できます。同じビルド構造を eclipse/ant と ivy から gradle (または gradle + ivy) に移行する簡単な方法はありますか?

ビルド プロセスは簡単です。

  1. サブプロジェクトの依存関係を ivy.xml から解決する
  2. サブプロジェクトをビルドする
  3. (すべてのサブプロジェクトに対して 1 と 2 を繰り返します)
  4. メイン プロジェクトの依存関係を解決します (ivy と eclipse/ant 構成の両方から)。
  5. メインプロジェクトをビルドする
  6. すべてを 1 つの jar ファイルにパッケージ化する

ロケット科学ではありません...しかし、アリに実装するには何日もかかりました。それをgradleに移行するのは本当に簡単ですか?はいの場合、出発点は何ですか?

eclipse プラグインがあることがわかりますが、.classpath を生成する可能性のみがあり、解析/読み取りはできません。Ivy XMLプラグインも表示されます。依存プロジェクト/モジュールを処理する方法が明確ではありませんか?

どんな助けでも大歓迎です。

よろしく: ベンス

4

2 に答える 2

3

多くのカスタム ant タスクがなく、ivy の依存関係を変換するだけでよい場合は、ivy.xml から gradle の依存関係が作成されます。ivy.xml と一緒に空の build.gradle に貼り付けて実行しますgradle ivyToGradle。次に、出力を build.gradle ファイルにコピーします。compileOnly 構成を使用するため、gradle 2.12+ が必要です。

これは、考えられるすべての ivy.xml 設定を処理するわけではありません。ivy.xml の特定の使用法を微調整する必要がある場合があります。ランタイム構成、テスト構成、コンパイルのみの構成、グローバル除外、推移的な true/false、およびバージョン強制などの基本を処理します。

task ivyToGradle {
    description "Converts dependencies in ivy.xml to gradle dependencies."
    doLast {
        def ivyModule = new XmlParser().parse(new File("$projectDir/ivy.xml"))
        if (!ivyModule.dependencies.exclude.isEmpty() || !ivyModule.dependencies.override.isEmpty()) {
            println "configurations.runtime {"
            ivyModule.dependencies.exclude.each {
                def excludeStrs = []
                if (it.@org != null) {
                    excludeStrs.add("group: '${it.@org}'")
                }
                if (it.@module != null) {
                   excludeStrs.add("module: '${it.@module}'")
                }
                if (!excludeStrs.isEmpty()) {
                    def excl = excludeStrs.join(", ")
                    println "    exclude ${excl}"
                }
            }
            def overrides = ivyModule.dependencies.override.findResults {
                if ("exact" != it.@matcher) {
                    return null
                }
                if (!it.@org || !it.@module || !it.@rev) {
                    return null
                }
                return "        '${it.@org}:${it.@module}:${it.@rev}'"
            }
            if (overrides) {
                println "    resolutionStrategy.force("
                println overrides.join(",\n")
                println "    )"
            }
            println "}"
            println ""
        }
        println("dependencies {")
        ivyModule.dependencies.dependency.each {
            def transitive = ("false" != it.@transitive)
            def force = ("true" == it.@force)
            def scope = "compileOnly" // Requires gradle 2.12 or later
            if (it.@conf?.contains("test")) {
                scope = "testCompile"
            } else if (it.@conf?.contains("runtime")) {
                scope = "compile"
            }
            def hasBlock = !it.exclude.isEmpty() || !transitive || force
            if (hasBlock) {
                println "    $scope('${it.@org}:${it.@name}:${it.@rev}') {"
                it.exclude.each {
                    def excludeStrs = []
                    if (it.@org != null) {
                        excludeStrs.add("group: '${it.@org}'")
                    }
                    if (it.@module != null) {
                       excludeStrs.add("module: '${it.@module}'")
                    }
                    if (!excludeStrs.isEmpty()) {
                        def excl = excludeStrs.join(", ")
                        println "        exclude ${excl}"
                    }
                }
                if (!transitive) {
                    println "        transitive = false"
                }
                if (force) {
                    println "        force = true"
                }
                println "    }"
            } else {
                println "    $scope '${it.@org}:${it.@name}:${it.@rev}'"
            }
        }
        println("}")
        println ""
    }
}
于 2016-04-11T03:57:18.300 に答える
1

ビルドを手動で移行し、build.xmlivy.xmlを Gradle のビルド言語に翻訳する必要があります。(Ant インポート機能がありますが、実際には特に役に立ちません。) 必要に応じて、Ant タスクを簡単に再利用できます。Eclipse Gradle プラグインを使用して Gradle ビルドを Eclipse にインポートするか、Gradle Eclipse プラグインを使用して Eclipse ファイルを生成できます。まず、 Gradle ユーザー ガイドの最初の数章を学習し、続いて Ant 統合とマルチプロジェクト ビルドに関する章を学習することをお勧めします。完全な Gradle ディストリビューションには、多くのサンプル ビルドが付属しています。

于 2013-06-26T20:21:40.103 に答える