在Gradle构建中处理缺省配置

时间:2013-03-07 17:59:23

标签: gradle

我有一个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

这填充了该配置就好了,但当然当我尝试对它进行任何操作时,它第一次遇到依赖于实际上 a {{ 1}}配置:

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 ,据我所知。或者,如果我这样做的方式是疯狂的,那么实现这一目标的Gradle成语是什么?

2 个答案:

答案 0 :(得分:0)

在引用配置之前,您需要检查配置是否存在。在这种情况下,gradle DSL documentation是您的朋友。实际上,gradle项目是我曾经合作过的最有文档记录的开源项目之一。

在这里,您会发现configurations只是configuration个对象的容器。它们分别是ConfigurationContainerConfiguration的实例。知道了这一点,您需要做的就是检查configurations容器是否包含名为“testResults”的configuration

这可以通过以下代码实现:

if (configurations.find { it.name == 'testResults' }) {
    // do your stuff
}

答案 1 :(得分:0)

似乎暗示传递给Dependency方法的processDependencyForTests实例是多模块构建中的模块依赖项。

在这种情况下,您可以将它们转换为ProjectDependency,该https://bz.apache.org/bugzilla/show_bug.cgi?id=48392具有dependencyProject属性,允许您访问该依赖项的Project对象。从那里,您可以使用depProject.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