如何在不修改设置的情况下添加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!)
  • 重建
    appa
    (从repo中提取最近更新的
    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'