Gradle:从父构建脚本配置子项目(模块)



我按照本指南将项目拆分为模块/子项目:

https://docs.gradle.org/current/userguide/multi_project_builds.html

在主脚本build.gradle中,我应用了子项目的配置:

subprojects {
repositories {
mavenCentral()
}
}

如果我从根构建目录运行子项目构建,这工作正常:

mainProject$ ./gradlew clean :common:build 

(成功构建:common模块(

但是我希望能够在目录中构建:common模块common

mainProject$ cd common
common$ ./gradlew clean build 

如果未在文件中显式配置存储库common/build.gradle则此操作将失败。但是我已经在上面的父配置中做到了,我希望子项目在可能的情况下选择父配置。

因此,热配置父项目和子项目,因此当我从子项目目录运行子项目构建时,它也考虑父配置(不仅是存储库配置,还有一些常量、依赖项等(。

问题出在子settings.gradle:子项目不应该有这个文件,否则 gradle 将当前目录视为根项目!

https://docs.gradle.org/current/userguide/build_lifecycle.html#sub:project_locations

https://docs.gradle.org/current/userguide/build_lifecycle.html#sec:initialization

首先:您不应该在每个子项目目录中安装 gradle 包装器脚本,而应该只在根项目目录中安装一个 gradle 包装器。 然后,如果你想从子项目目录调用build,你必须从父目录中引用gradlew脚本:这在包装器文档的一个注释中进行了解释: https://docs.gradle.org/current/userguide/gradle_wrapper.html#sec:using_wrapper

在官方文档的另一页中也有对此的引用: https://docs.gradle.org/current/userguide/intro_multi_project_builds.html#sec:executing_a_multiproject_build

最后还有一件事需要注意。当您使用 Gradle 包装器时,第一种方法效果不佳,因为如果您不在项目根目录中,则必须指定包装器脚本的路径。例如,如果您在 Web 服务子项目目录中,则必须运行 ../../gradlew build.

从子项目目录执行构建时,Gradle 将自动搜索根项目配置,如您所料:这是在初始化阶段完成的(请参阅此处:https://docs.gradle.org/current/userguide/build_lifecycle.html#sec:initialization(

最新更新