Jef*_*rey 21 configuration structure gradle
在gradle中,使用buildSrc文件作为顶级的目的是什么,而不是仅仅是典型的Java项目布局(src/main/java)?
如果我有布局
src
main
java
Run Code Online (Sandbox Code Playgroud)
要么
buildSrc
src
main
java
Run Code Online (Sandbox Code Playgroud)
有什么区别(或者这样做的原因)?它在多模块项目中更有用吗?即使对于多模块项目,我也不能做类似的事情
proj1
src
proj2
src
Run Code Online (Sandbox Code Playgroud)
然后只需要一个顶级的build.gradle(与proj1and 相同的级别proj2)来定义项目中的常见设置?
Pet*_*ser 40
buildSrc是一个单独的构建,其目的是构建任何任务,插件或其他类,这些类旨在用于主构建的构建脚本中,但不必跨构建共享.(*)它不会是可以构建这样的类作为主构建的一部分,因为它们必须在主构建的构建脚本甚至可以编译/评估之前存在,并且Gradle在它完成任何工作之前编译/评估所有构建脚本(配置与执行阶段) .
与将所有构建代码放入构建脚本相比,buildSrc为您提供了一种开发构建代码的方法,更像是常规代码,可以测试的类,导入到IDE中等等.这是保持构建脚本简单和干燥的一种方法,即使对于更复杂的构建.
buildSrc 更常见于多项目构建中,因为较大的构建更有可能实现自己的自定义任务和插件.
随着时间的推移,buildSrc将成为在单个Gradle调用中执行多个依赖构建的更一般的功能.
(*)跨越构建共享类是可能的,但更多涉及.特别是,您需要将类发布到存储库,并且使用构建必须从那里显式地导入它们,类似于在构建之间共享生产库时.
在 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. 如果您记得该文件夹被视为包含构建(即外部),那么它为什么看不到包含它的项目的类路径应该是有道理的。| 归档时间: |
|
| 查看次数: |
5435 次 |
| 最近记录: |