10

製品の主要な成果物 (インストーラー) を生成する Gradle ビルドがあります。これをモデル化する Gradle プロジェクトには、さまざまな構成でさまざまな依存関係があります。これらの依存関係の多くは、外部モジュールの既定の構成にあり、これらのモジュールの一部にtestResultsは、テスト タスクの (圧縮された) 結果を含む構成があります。

すべての依存関係のテスト結果が存在する場合は、主要な製品ビルドの成果物として公開することが重要です (テストが行​​われ、成功したという証拠として使用するため)。それらが存在しなくても問題ありません。

製品ビルドのすべての構成を反復し、それぞれの依存関係を反復し、プログラムで作成された依存関係を (この目的のために作成された新しい構成で)testResultsモジュールの構成に追加することで、これを実行しようとしました。

つまり、次のような依存関係を作成します。

def processDependencyForTests( Dependency dependency ) {

    def testResultsDependency = [
      'group' : dependency.group,
      'name' : dependency.name,
      'version' : dependency.version,
      'configuration' : 'testResults'
      ]

    project.dependencies.add 'allTestResults', testResultsDependency

これはその構成を問題なく取り込みますが、もちろん、それを使って何かをしようとすると、実際には構成を持たないモジュールへの依存関係に初めて遭遇したときに失敗しtestResultsます:

   def resolvedConfiguration = configurations.allTestResults.resolvedConfiguration

結果は次のようになります。

Build file 'C:\myproduct\build.gradle' line: 353

* What went wrong:
Execution failed for task ':myproduct:createBuildRecord'.
> Could not resolve all dependencies for configuration ':myproduct:allTestResults'.
   > Module version group:mygroup, module:myproduct, version:1.2.3.4, configuration:allTestResults declares a dependency on configuration 'testResults' which is not declared in the module descriptor for group:mygroup, module:mymodule, version:1.0

代わりに、宣言的な方法で依存関係を明示的にリストすることは実際には実用的ではありません。なぜなら、「製品プロジェクトに実際にある依存関係が何であれ」から派生させたいからです。

そのような予想される不足している構成がビルドを狂わせないようにするにはどうすればよいですか? 寛大な構成と関係があることが答えかもしれないと思いましたが、ここまではまだ到達していません (私ResolvedConfigurationが知る限り、最初に取得する必要があります)。または、これを行う方法が正気でない場合、これを達成するためのより自然な Gradle イディオムは何ですか?

4

2 に答える 2

2

参照する前に、構成の存在を確認する必要があります。このような場合、gradle DSL ドキュメントが役に立ちます。実際、gradle プロジェクトは、私がこれまでに携わった中で最も文書化されたオープン ソース プロジェクトの 1 つです。

configurationsここでは、それが単なるオブジェクトのコンテナーであることがわかりconfigurationます。これらはそれぞれConfigurationContainerConfigurationのインスタンスです。これを知っていれば、コンテナーに名前付きの「testResults」configurationsが含まれているかどうかを確認するだけです。configuration

これは、次のコードで実現できます。

if (configurations.find { it.name == 'testResults' }) {
    // do your stuff
}
于 2013-03-13T22:41:59.487 に答える
0

Dependencyメソッドに渡されるインスタンスprocessDependencyForTestsは、マルチモジュール ビルドのモジュール依存関係であることを暗示しているようです。

この場合、その依存関係のオブジェクトに到達できるプロパティを持つProjectDependencyにそれらをキャストできます。そこから、構成が存在するかどうかをテストするために使用できます。dependencyProjectProjectdepProject.configurations.findByName

次のようなもの:

def processDependencyForTests( Dependency dependency ) {
  if( dependency instanceof ProjectDependency ) {
    ProjectDependency projDep = (ProjectDependency) dependency
    if( projDep.dependencyProject.configurations.findByName( 'testResults' ) ) {
      def testResultsDependency = [
        'group' : dependency.group,
        'name' : dependency.name,
        'version' : dependency.version,
        'configuration' : 'testResults'
      ]
      project.dependencies.add 'allTestResults', testResultsDependency
    }
  }

HTH

于 2015-07-08T15:34:12.950 に答える