Gradle依赖替换与本地文件开发环境

aiazj4mn  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(176)

我正在使用gradle进行一个包含多个子项目的项目。在root build.gradle中,我们声明了一些依赖项。其中大部分是标准依赖项,但其中一些是特定于我们的项目的,只能从我们的GitLab环境访问。这大致是我们的build.gradle的样子:

subprojects {

    apply plugin: 'java'

    compileJava.options.encoding = 'UTF-8'

    dependencies {

        compileOnly "GroupName:ModuleA:${rootProject.ext.moduleAVersion}"
        compileOnly "GroupName:ModuleB:${rootProject.ext.moduleBVersion}"
        testCompile "GroupName:ModuleA:${rootProject.ext.moduleAVersion}"

        ...other non-problematic deps...

    }

    tasks.withType(Ear) {

        dependencies {

            earlib "GroupName:ModuleA:${rootProject.ext.moduleAVersion}"
            ...other non-problematic deps...
        }

        ear {
            baseName "some valid name"

        }
    }
}

在开发过程中,我们注解掉了相关deps的“compileOnly”和“testCompile”,并将它们替换为如下逻辑:

def sdkJars = fileTree(dir: "${rootProject.rootDir}\\BuildFiles")
compileOnly sdkJars
testCompile sdkJars

sdkJars是一个有效的目录,其中包含满足这些依赖关系所需的所有jar文件。这可能非常笨拙,必须不断插入此逻辑并确保在推送更改时不会提交,我们需要一个新的范例,允许开发人员简单地将“env”设置为“dev”进行构建而不必担心修改他们的gradle文件。
在开发环境中,是否可以使用依赖项替换或类似的方法来手动加载jar文件中的依赖项。在测试中,我探索了这样的选项,但无法找出如何将依赖项替换为文件中的jar:

configurations.all {
    resolutionStrategy.dependencySubstitution.all { DependencySubstitution dependency ->
        // In dev env, replace deps we know will fail
        if (project.env == "dev") {
            if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.group == "GroupName") {
                  // what can go here?
            }
        }
    }
}
dauxcl2d

dauxcl2d1#

学习很有趣!
自从发布这个问题后,我了解了这个问题的简单而直接的解决方案:平面目录存储库。
https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:declaring_multiple_repositories
在我的仓库中,我添加了:

flatDir {
                dirs rootProject.property("devBuildFiles")
            }

这允许开发人员在项目级或用户级gradle.properties文件(https://docs.gradle.org/current/userguide/directory_layout.html#dir:gradle_user_home)中指定目录。
然后Gradle会将指定的目录视为存储库。它会将任何模块名称与目录中的文件进行匹配。
示例:
原始依赖声明:

compileOnly GroupName:ModuleA:${rootProject.ext.moduleAVersion}

评估为:

GroupName:ModuleA:1.0.0

这可以通过名为以下的jar文件来满足:

"ModuleA-1.0.0.jar"

相关问题