如何在 gradle 6.0+ 上向设置 gradle 脚本添加 class / 枚举?

How to add a class / an enum to settings gradle script on gradle 6.0+?

我想添加一个名为 modules 的枚举,其中包含子模块的路径和一些编译类型。

我曾经在 gradle 6 之前在 buildSrc 中有这个,它可以在 settings.gradle

中访问

但是从gradle 6.0开始,settings.gradle是在buildSrc项目之前编译的。我已将我的枚举移动到 settings.gradle,现在其他项目级别 gradle 脚本无法访问它。

以下发行说明中概述了行为更改。 https://docs.gradle.org/current/userguide/upgrading_version_5.html#changes_to_plugins_and_build_scripts

他们建议将 settings.gradle 中使用的枚举 / 类 添加到构建脚本闭包中,但我不太确定该怎么做。

https://docs.gradle.org/current/userguide/upgrading_version_5.html#plugins_and_classes_loaded_in_settings_scripts_are_visible_to_project_scripts_and_buildsrc

我最近遇到了一个类似的问题,我的公司有自定义代码用于使用我们保存在 buildSrc 中的 Nexus 进行身份验证。我无法将它变成一个插件,因为我需要将它存储在我们的 Nexus 中,然后会处于 catch-22 情况,因为我需要进行身份验证才能获得身份验证插件!

我可以看到 2 个可能的解决方法:

  1. 公开发布的jar.

将您的自定义 类 构建为单独的 jar 或 Gradle 插件(如果适合用例)。将 jar 发布到可以从 settings.gradle buildscript 访问的 maven 存储库(对我来说这很困难,因为它是敏感的公司特定代码)。

这在您的 settings.gradle 中可能类似于以下内容:

include "project-name"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
       classpath 'com.companyname:gradle-utils:0.0.1'
    }
}

  1. 提交二进制文件

这不是一个理想的选择,但您可以在另一个存储库中管理自定义 buildSrc 类 的源代码,然后每次更改它们时(希望很少)- 您可以构建新版本并将构建的 jar 提交到需要使用它的存储库中(可能在 buildSrc 下)。如果您的自定义代码在 gradle 运行时具有自然不在类路径上的依赖项,则您还需要将它们打包到您提交的 jar 中。

您的 settings.gradle 可能看起来像:

include "project-name"

buildscript {
    dependencies {
         classpath files("buildSrc/gradle-utils.jar")
    }
}