Gradle:我如何实际使用自定义依赖项配置或将外部依赖项交换为本地依赖项?

时间:2013-10-11 19:21:39

标签: android gradle android-studio android-gradle

问题

在Gradle中,给定自定义依赖项配置,在Android中实际使用/编译它的最简单方法是什么?或者,在“本地”和“外部”依赖关系之间切换的最佳方法是什么?

问题

为了使构建更容易并更好地利用多项目构建,我创建了一个其他人可能使用或不使用的顶级“聚合器”项目。因此,对子项目的任何修改都必须在聚合器中自包含。

在这个聚合器的构建过程中,我想总是使用子项目的本地版本(即我正在编辑的源代码),而不是我们的存储库中的编译工件。此外,此聚合器将用于我们的持续集成环境中,以便在每个代码提交时运行所有子项目的单元测试。

详细信息:部分解决方案

给定类似于以下内容的平面文件夹结构,其中所有项目/模块都是分离的,这样孩子们就不会对父母有所了解。

+ Parent Aggregator Project
|---- build.gradle
|---- settings.gradle
|   + app                  
|   |---- build.gradle
|   + models               
|   |---- build.gradle
|   + networking           
|   |---- build.gradle
|   + utils                
|   |---- build.gradle

我在最顶层的项目中创建了以下build.gradle文件:

allprojects {
    configurations {
        localProjects {
            extendsFrom compile
        }
    }
}

project(':app') {
    dependencies {
        localProjects project(':models')
        localProjects project(':networking')
    }
}

project(':networking') {
    dependencies {
        localProjects project(':utils')
    }
}

localProjects配置正常工作,并且每个配置都已成功用本地项目替换现有依赖项(如'com.mycompany:utils:1.0.0'和'com.mycompany:models:1.0.0') 。唯一的问题是我无法弄清楚如何让Android使用'localProjects'依赖集而不是'compile'依赖集。

在纯java示例中,我看到人们手动替换sourceSet中的类路径,但这对Android插件不起作用。

摘要

如何将Android构建指向自定义依赖项配置,以便使用这些依赖项而不是compiledebugCompilereleaseCompile构建它们?

最终,我只想让增量构建工作。例如,如果我编辑'models'源代码,那么:

  • 下次构建应用程序时,它会重新编译“模型”项目
  • 它不会重新编译'networking'或'utils'代码
  • 这些更改会在构建一次后立即显示在应用程序中(即不再需要在3或4个地方构建以生成带有'最新'的APK)
  • 当我对这些项目中的任何一个项目进行代码更改时,我所要做的就是从聚合器项目运行构建并编译正确的东西,并且生成的APK反映了我机器上的最新代码
  • 同样,我可以仅从聚合器
  • 运行所有单元测试
  • 最后但并非最不重要的是,我无法编辑现有项目来完成此任务。所有更改必须在聚合器中自包含,因为项目中还有其他工程师可能不会选择使用它。

这是一个非常常见的用例,Gradle团队已经提到将来为这类事情添加更好的支持。与此同时,我们如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你不能这样做 - 子项目受到你的“聚合器项目”的影响。您可以做的是使其可配置是否在内部或外部解决特定依赖关系(子项目构建和整体构建)。有关概念验证,请参阅https://github.com/pniederw/elastic-deps