在 gradle 中,使用 buildSrc 文件作为顶层文件的目的是什么,而不仅仅是典型的 java 项目布局(src/main/java)?
你绝对可以做到这一点。它被称为 gradle 中的复合构建,但您必须告诉 Gradle包含该文件夹中的任何构建。顶级文件夹的一个独特属性buildSrc
是 gradle 自动将其视为包含的构建。
请注意,即使buildSrc
被视为复合构建,当您运行时,它在包含的构建列表中也不可见gradle.getIncludedBuilds()
。我相信原因是因为该列表是为您手动包含在settings.gradle
.
为了让您也包含src/main/java
为复合构建,您必须使用--include-build
标志运行您的 gradle 脚本,然后是src/main/java
. 对于包含的构建来说,这是一个不寻常的地方,但 gradle 不会抱怨。
然后只有一个顶级 build.gradle(与 proj1 和 proj2 处于同一级别),它定义了项目中的通用设置?
您可以拥有与您的, 和子项目build.gradle
相同级别的顶层。这通常是大多数多项目项目的结构方式。proj1
proj2
正如已经强调的另一个答案,该buildSrc
项目的目的是创建自定义插件或任务,这些插件或任务旨在在您的构建中的不同项目之间本地共享。这并不意味着您不能在顶级build.gradle
. 您可以这样做,但问题是您将无法在任何子项目中使用它。
请记住,能够在 java/groovy 中导入某些内容需要该内容存在于正确的 java/groovy 文件(或 java 9+ 的模块)中。由于您build.gradle
只是一个脚本,因此简单地从中导入插件或任务并不是任意的。
正如我已经指出的,这是来自Gradle 文档,拥有目录的原因之一buildSrc
是:
发现目录后,Gradle 会自动编译和测试此代码,并将其放入构建脚本的类路径中。
如您所见,它buildSrc
充当构建过程的扩展,因为它可以为您项目的所有构建脚本添加额外的功能。
还有几点:
dependencies
在您的项目中声明的任何buildSrc/build.gradle
内容都对项目中的其他构建脚本可见。
- 您中的
buildscript
块buildSrc/build.gradle
仅对其他人可见,buildSrc/build.gradle
而没有其他内容。
- 中定义的任何插件类
buildSrc
都可以在项目中的任何构建脚本中使用,并且不需要在META-INF/gradle-plugins
.
build.gradle
在主项目或任何子项目中定义的任何依赖项在buildSrc
. 如果您记得这个文件夹被视为包含的构建(即外部),那么它为什么看不到包含它的项目的类路径应该是有道理的。