【问题标题】:How to share some classes with buildSrc and one of subprojects?如何与 buildSrc 和子项目之一共享一些类?
【发布时间】:2020-10-30 08:24:35
【问题描述】:

我有几个最初只在 buildSrc 中使用的类。但现在我在子项目 A2 中也需要它们。

| - rootProject A
    | - buildSrc
    | - subproject A1
    | - subproject A2
  • 选项 1. 将这些类保留在 buildSrc 中并尝试将 implementation(":buildSrc") 添加到 A2 的依赖项中。不幸的是,它没有用。我无法链接到 buildSrc,gradle 说“项目 A 中没有 'buildSrc' 子项目”。
  • 选项 2。在子项目 A2 中使用 implementation(files("${project.rootDir}/buildSrc/build/classes/")) 效果不佳。它会构建,但在 A2 的源代码中无法访问 buildSrc 中的类。
  • 选项 3。好的。让我们在新的子项目 A3 中提取这些类。在这里,再次失败。 buildSrc 不能依赖 A 的任何项目。否则就是循环依赖。
  • 选项 4。那么,我们可以将其提取到单独的 rootProject B 并创建复合构建。在 A 的 settings.gradle.kts 中,我输入了 includeBuild("B")。再说一次,我可以在 A2 中将它用作 implementation("mygroup:B") 并且不能在 buildSrc 中使用它:Could not find mygroup:B.\n Required by:\n project :

那么,我还有哪些选择?还是我之前的尝试做错了什么?

【问题讨论】:

标签: gradle


【解决方案1】:

我相信您可以从 Gradle 6.7 开始使用选项 4

参见Issue #3768related release notes in v6.7

"包含的构建现在对 buildSrc 可见 我们建议构建使用特别命名的 buildSrc 构建来组织命令式和通用构建逻辑。

有时,您可能还需要在 buildSrc 本身和您的根构建之间共享构建逻辑。在以前的版本中,这是不可能的,因为 buildSrc 无法从其他包含的构建中访问构建逻辑。

在此版本中,现在可以在 buildSrc 和根构建或任何其他包含的构建之间共享构建逻辑。这使得在 buildSrc 和其他构建之间共享通用存储库声明或约定变得更加容易,如本示例中所示。”

【讨论】:

  • 我最初使用的是 Gradle 6.7。但据我了解,它与插件有关,因此与 buildSrc 的构建文件和子项目的构建文件共享代码有关。但我需要 buildSrc/src 和 subproject/src 中的那些类。
  • 可能是一个错误,我可以创建一个问题?
  • 将“通用”代码放在其自己的单独构建中,该构建通过复合包含。然后,您应该能够在“anotherProject/buildSrc”或“anotherProject/subProject”中使用“common”。唯一不能使用“common”逻辑的地方是“common/buildSrc”(仅从 Gradle 6.7 开始)
  • 我发誓这行不通。 “anotherProject/buildSrc”构建时出错。 please check可能是我做错了什么?
  • 不,那是错误的。通过它的 group:artifact:version 从包含的构建中引用工件,就像它来自存储库一样,而不是通过 :project-name。例如,就像您引用 spring jars 或 mockito 或外部依赖项一样
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 2019-12-22
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多