2016-10-20 11 views
0

を解決された後、私は他のサブプロジェクトA.に依存サブプロジェクトBを持ってメイクジップタスクの実行の依存関係が

dependencies { 
    compile project(':projA') 
} 

私のサブの両方プロジェクトAとBはリリース時にバンドルされたジップを作成します。サブプロジェクトAを参照しなくても、サブプロジェクトAに属するいくつかのファイルをサブプロジェクトBにコピーしたいと考えています。ルートプロジェクトの "build.gradle"スクリプトには次のタスクが含まれています。

subprojects { 
    task bundleBin(type: Zip) { 
     description 'Creates "bin.zip" bundle.' 

     dependsOn build 

     def bundleName = "$outputName-bin" 

     /// THIS DOES NOT WORK 
     def deps = configurations.runtime.getAllDependencies().findAll { it instanceof ProjectDependency } 
     println "GROOT: " + deps 

     into("$bundleName/dep") { 
      /// THE LINE BELOW WORKS 
      /// I do not want a fixed reference since it is already defined in each subproject's "build.gradle" file 
      //from project(':projA').file('conf/') 
      for (dep in deps) { 
       def proj = dep.getDependencyProject() 
       from (proj.projectDir) { 
        include "conf/" 
        include "scripts/" 
       } 
      } 
     } 

     into(bundleName) { 
      from(".") { 
       include "conf/" 
       include "scripts/" 
      } 
     } 

     into("$bundleName/lib") { 
      from configurations.runtime.allArtifacts.files 
      from configurations.runtime 
     } 

     archiveName = "${bundleName}.zip" 
    } 
} 

私はいくつかの他のプロジェクトに依存し、私が個別に各依存関係を維持したくないプロジェクトのリストを持っているので、私は再びサブプロジェクトAを参照するようにしたくない理由があります。

上記のスクリプトを実行するには、Bを実行するときにAとBで "conf /"と "scripts /"をとり、 "B-bin.zip"に入れます。一方、AとBに依存するサブプロジェクトCがある場合、上記のスクリプトはA、B、Cで "conf /"と "scripts /"をとり、 "C-bin.zip"に入れます。

上記のスクリプトを実行すると、doLastでカプセル化しない限り、依存関係は表示されません。ただし、これはZipタスクでは機能しません。

私の質問は、これをどのように修正するのですか?

答えて

0

@Alparに記載されているように、これはZipタスクが構成段階での依存関係を処理しているためです。それを解決するために、私はこれに続いたanswer

はこのように、私のバンドルコードは今のようになります。

task bundleBin << { 
    task bundleBin_childTask(type: Zip) { 
     def bundleName = "$outputName-bin" 
     def deps = configurations.runtime.getAllDependencies().findAll { it instanceof ProjectDependency } 

     into(bundleName) { 
      for (dep in deps) { 
       def proj = dep.getDependencyProject() 
       from (proj.projectDir) { 
        include "conf/" 
        include "scripts/" 
       } 
      } 
     } 

     into(bundleName) { 
      from(".") { 
       include "conf/" 
       include "scripts/" 
      } 
     } 

     into("$bundleName/lib") { 
      from configurations.runtime.allArtifacts.files 
      from configurations.runtime 
     } 

     archiveName = "${bundleName}.zip" 
    } 

    bundleBin_childTask.execute() 
} 

このソリューションは、ジップタスクが実行フェーズでの含まれるファイルを解決強制します。

1

最初に設定を解決する必要があります。 .resolvedConfigurationを使用してこれを行うことができますが、設定時に解決するということは、どのタスクが呼び出されたかに関係なく実行されるため、避けるべきです。 This anwserは、設定を直接反復処理することで同じ結果を得ることができます。

gradle.taskGraph.whenReadyを使用すると、タスクが実行されようとしている場合にのみ構成の解決を遅らせることができます。まだタスクを設定することはできます。