Gradle构建中如何跨文件调用另一个gradle文件定义的方法
Gradle跨文件调用自定义方法实现方案
Gradle跨脚本调用自定义方法有三种常用实现,按需选择即可:
- 方案1:单独工具脚本 + apply引入(轻量场景首选)
这是最灵活的方式,适合把上传相关逻辑单独抽成独立脚本维护的场景。- 先改造存放
sendMessage方法的第一个Gradle文件(比如命名为pgy_utils.gradle,建议存放在项目根目录的gradle文件夹下),不要直接用def定义局部方法,把方法挂载到ext扩展属性上,避免作用域问题:
// pgy_utils.gradle ext.sendMessage = { String appName, String versionCode -> println("${appName}---${versionCode}") }- 在写自定义上传任务的第二个Gradle文件(一般是app模块的
build.gradle)开头,引入这个工具脚本,路径按你实际存放位置调整:
// app/build.gradle 开头添加 apply from: "${rootProject.projectDir}/gradle/pgy_utils.gradle"- 直接在任务的doLast块里调用方法即可,完整代码参考:
afterEvaluate { android.applicationVariants.each { variant -> String variantName = variant.name.capitalize() // 这里按你实际业务取appName、versionCode的值即可 def currentAppName = variant.applicationId def currentVersionCode = variant.versionCode.toString() def uploadTask = tasks.create("apkUploadPGY${variantName}") uploadTask.dependsOn("resguard${variantName}") uploadTask.doLast { sendMessage(currentAppName, currentVersionCode) } } } - 先改造存放
- 方案2:方法挂载到根项目扩展属性(无需单独建文件)
如果不想单独抽工具脚本,直接把方法写在根目录的build.gradle里,全局所有子模块都能调用:- 在根目录build.gradle里添加方法定义:
// 根目录build.gradle ext { sendMessage = { String appName, String versionCode -> println("${appName}---${versionCode}") } }- 子模块脚本里直接通过rootProject调用即可,也可以提前赋值给局部变量简化写法:
// app/build.gradle里直接定义局部引用 def sendMessage = rootProject.ext.sendMessage // 后续doLast块里直接调用sendMessage就行 - 方案3:buildSrc统一管理工具方法(复用逻辑多的中大型项目首选)
如果项目里有大量跨模块复用的构建逻辑,用Gradle默认支持的buildSrc目录管理最规范:- 在项目根目录新建路径
buildSrc/src/main/groovy,新建Groovy工具类,把方法定义为静态方法:
// buildSrc/src/main/groovy/BuildHelper.groovy class BuildHelper { static void sendMessage(String appName, String versionCode) { println("${appName}---${versionCode}") } }- 不用额外配置引用,任何Gradle脚本里直接调用即可:
uploadTask.doLast { BuildHelper.sendMessage(currentAppName, currentVersionCode) } - 在项目根目录新建路径
避坑提示:不要直接在独立脚本里用
def 方法名()的方式定义局部方法做跨文件调用,def修饰的方法作用域仅限当前脚本内部,就算apply引入也可能因为Gradle闭包的委托机制出现找不到方法的问题,挂载到ext扩展属性上是最稳妥的轻量实现方式。
内容的提问来源于stack exchange,提问作者武器商人
相关产品推荐
相关产品推荐

