在Gradle构建中处理缺省配置

And*_*bin 10 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
Run Code Online (Sandbox Code Playgroud)

这种填充该配置就好了,当然,当我尝试用它做什么,它失败了,我第一次遇到一个模块的依赖关系实际上并不一个testResults配置:

   def resolvedConfiguration = configurations.allTestResults.resolvedConfiguration
Run Code Online (Sandbox Code Playgroud)

结果如下:

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
Run Code Online (Sandbox Code Playgroud)

以声明方式显式列出依赖关系并不真实,因为我希望它们来自" 产品项目具有的任何真正依赖关系".

我怎样才能确保这些预期的缺失配置不会破坏我的构建?我认为与宽松的配置有关可能是答案,但我在这里甚至没有那么远(我需要得到ResolvedConfiguration第一个,据我所知).或者,如果我这样做的方式是疯狂的,那么实现这一目标的Gradle成语是什么?

Ste*_*nar 5

在引用配置之前,您需要检查配置是否存在。在这种情况下,gradle DSL 文档是你的朋友。事实上,gradle 项目是我使用过的文档最齐全的开源项目之一。

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

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

if (configurations.find { it.name == 'testResults' }) {
    // do your stuff
}
Run Code Online (Sandbox Code Playgroud)