如何在projectA构建脚本中调用projectB子模块的Gradle任务?
如何从ProjectA调用ProjectB子模块的Gradle任务?
先明确你的场景:两个独立Gradle项目,目录结构是这样的:
./ ├── projectA │ ├── build.gradle │ ├── settings.gradle │ ├── gradlew │ ├── .gradle/ │ ├── gradle/ │ └── submodulea/ └── projectB ├── build.gradle ├── settings.gradle ├── gradlew ├── .gradle/ ├── gradle/ └── submoduleb/
你想在projectA的构建脚本里触发projectB/submoduleb的test任务,这个任务定义是:
// projectB/submoduleb/build.gradle task test() { println 'hello from :projectB:submoduleb' }
有两种靠谱的实现方式,看你需求选:
方法一:用Gradle复合构建(推荐)
这种方式最优雅,Gradle会把两个项目整合进同一个构建上下文,能自动处理依赖和任务依赖关系。
- 打开projectA的
settings.gradle,添加一行把projectB纳入复合构建:
includeBuild '../projectB'
这里的路径是projectA根目录到projectB根目录的相对路径,根据你的实际目录结构调整就行。
- 然后在projectA的
build.gradle里,就可以直接创建任务依赖projectB的目标任务了:
task runSubmoduleBTest { // 依赖projectB/submoduleb的test任务 dependsOn ':projectB:submoduleb:test' doLast { println "已经成功触发submoduleB的test任务啦" } }
现在你在projectA根目录执行./gradlew runSubmoduleBTest,就能看到submoduleB的test任务输出了。
方法二:直接执行外部Gradle命令
如果你不想把projectB纳入复合构建,也可以用Gradle的exec任务直接调用projectB的gradlew脚本。
在projectA的build.gradle里添加这个任务:
task triggerExternalTest { doLast { // 指向projectB的根目录,路径根据实际情况调整 def projectBRoot = file('../projectB') exec { workingDir projectBRoot // Unix/macOS用这个命令 commandLine './gradlew', ':submoduleb:test' // 如果是Windows环境,换成下面这行 // commandLine 'gradlew.bat', ':submoduleb:test' } } }
执行./gradlew triggerExternalTest后,Gradle会在projectB的目录下单独运行指定任务,和你手动去projectB里执行./gradlew :submoduleb:test效果一样。
注意事项
- 路径一定要检查对!如果你的projectA和projectB不是同级目录,要调整
file()里的相对路径,比如用project.rootDir.toPath().resolve("../projectB").toFile()这种更稳妥的方式获取绝对路径。 - 跨平台的话,可以加个判断自动选gradlew脚本:
def gradlewScript = OperatingSystem.current().isWindows() ? 'gradlew.bat' : './gradlew' commandLine gradlewScript, ':submoduleb:test' - 复合构建的方式更推荐,因为它能共享构建缓存,避免重复编译,还能让Gradle管理任务之间的依赖,而exec方式是完全独立的外部构建,灵活性稍差但不需要修改settings.gradle。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

