如何在不修改设置的情况下添加gradle项目依赖项。gradle 出身背景
(请记住,为了便于讨论,我简化了这个问题)如何在不修改设置的情况下添加gradle项目依赖项。gradle 出身背景,gradle,dependencies,build.gradle,gradle-plugin,Gradle,Dependencies,Build.gradle,Gradle Plugin,(请记住,为了便于讨论,我简化了这个问题) 我有一组应用程序和相关库,类似这样(每个都有src/目录和build.gradle): 在build.gradle中,依赖项当前声明如下: appa/build.gradle: compile "com.asdf:libx:1.0" compile "com.asdf:liby:1.0" appb/build.gradle: compile "com.asdf:liby:1.0" liby/build.gradle: com
- 我有一组应用程序和相关库,类似这样(每个都有
目录和src/
):build.gradle
- 在
中,依赖项当前声明如下:build.gradle
appa/build.gradle: compile "com.asdf:libx:1.0" compile "com.asdf:liby:1.0" appb/build.gradle: compile "com.asdf:liby:1.0" liby/build.gradle: compile "com.asdf:libz:1.0"
- 假设我正在使用
,我需要对appa
进行更改。我需要执行多个步骤:libx
- 从源代码管理中拉取
,并在本地进行更改libx
- 重建并将更改推送到某些回购(而不是prod!)
- 重建
(从repo中提取最近更新的appa
)libx
- 如果我的测试显示libx中有一个bug,我必须重复一遍
- 在像Eclipse这样的IDE中工作时,这是非常烦人的,即使我的项目在逻辑上使用了其他项目,我仍然必须使用工件作为依赖项
- 如果我可以在本地拉取项目,并且逻辑上依赖它的项目将自动使用源项目而不是工件进行构建,这不是很好吗
- 我已经编写了一个小的gradle插件(在每个项目的
)来识别build.gradle
依赖项,如果该项目在本地存在,则使用该插件将工件依赖项替换为项目依赖项com.asdf
configurations.all { resolutionStrategy.dependencySubstitution { all { DependencySubstitution dependency -> if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.group == 'com.asdf') { def targetProject = findProject(":${dependency.requested.module}") if (targetProject != null) { dependency.useTarget targetProject } } } } }
- 耶!通过对
(见下文)的一些修改,我已经完成了我的目标。。。除了settings.gradle
- 我需要修改
以包含每个依赖项的类似行(否则settings.gradle
在构建期间不会解析依赖项目):findProject
- 虽然可以遍历所有
文件并执行此操作(作为我的概念证明,我已经做了一些),但它是丑陋的、重复的,逻辑上与传递给设置.gradle
依赖项的build.gradle
参数的信息相同编译
- 当有人添加新的依赖项但不更新
,或在它们之间引入打字错误时,也很容易出错设置.gradle
- 当有人添加新的依赖项但不更新
- 我也尝试过设置。gradle只需为在该级别找到的所有目录定义项目,但构建任何项目都会变成所有项目的大型构建
- (我试过其他几种方法,但我的问题已经很难回答了)
settings.gradle
和build.gradle
之间不复制信息的情况下,有什么更好的方法可以做到这一点?我想这样做,添加新的依赖项仍然与在build.gradle
中添加compile
引用一样简单,而无需触摸settings.gradle
我还是groovy/gradle的新手,所以我可能错过了一些对更有经验的gradle大师来说很明显的东西?我相信您的用例是开发groovy/gradle的动机 我有一个演示,它作为工件的模拟发布写入
jars
文件夹。请务必查看README.md,因为演示是一个小型实验室,用于在复合构建之前和之后试用用例
在演示中,mainBuild
是appa
utils
是libx
。mainBuild/settings.gradle
()中的关键语法是:
这告诉Gradle使用本地代码库而不是发布的工件。当然,我们不会将这一行提交给源代码管理。听起来像是在寻找@mkobit——表面上看,这确实很有希望。周末后,我们将更深入地了解它的工作原理。确实有用,但复合构建似乎有一些限制-根据文档,它们只能深入一层(不能依赖于另一个复合构建),并且仍然需要在
设置中复制信息。gradle
(尽管看起来“更少”)出淤泥,这仍然是需要的)。当然这是一个值得进一步探索的领域,谢谢:)
configurations.all {
resolutionStrategy.dependencySubstitution {
all { DependencySubstitution dependency ->
if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.group == 'com.asdf') {
def targetProject = findProject(":${dependency.requested.module}")
if (targetProject != null) {
dependency.useTarget targetProject
}
}
}
}
}
include ':libx'
project(':libx').projectDir = new File(settingsDir, '../libx')
includeBuild '../utils'