如何在Android项目配置阶段运行Gradle插件中的自定义Gradle任务
问题根源
你创建的自定义Gradle任务默认是独立节点,没有和Gradle的构建生命周期链路绑定,只有当任务被显式触发、或者被其他需要执行的任务依赖时,才会进入执行队列运行。你手动点击运行按钮本质就是直接触发该任务执行,所以能正常跑。
另外你对create和register的理解是正确的,但二者的差异仅在任务初始化时机,和是否会自动执行没有关联。
解决方案
根据你的使用场景选择对应方案即可:
场景1:配置逻辑需要在构建前自动执行(推荐)
你的需求是做项目前置配置,一般可以把任务绑定到Android项目的preBuild生命周期节点上,每次构建时会先执行你的自定义任务,再跑后续构建逻辑。修改插件的apply方法代码如下:
class CommonManager: Plugin<Project> { override fun apply(target: Project) { println("APPLY FUNCTION HAS BEEN ENTERED") // 推荐用register懒加载创建任务,提升配置阶段性能 val myPluginTask = target.tasks.register("myPluginTask", ReleaseManager::class.java) // 给Android应用模块绑定任务 target.pluginManager.withPlugin("com.android.application") { target.tasks.named("preBuild").configure { preBuild -> preBuild.dependsOn(myPluginTask) } } // 给Android库模块绑定任务,不需要可以删掉 target.pluginManager.withPlugin("com.android.library") { target.tasks.named("preBuild").configure { preBuild -> preBuild.dependsOn(myPluginTask) } } } }
场景2:不需要绑定构建流程,apply插件后立即执行任务
如果不需要和构建任务绑定,希望apply插件、参数配置完成后立刻执行任务,可以在apply方法末尾添加执行逻辑,注意该方式使用了Gradle内部API,可能存在版本兼容风险:
override fun apply(target: Project) { // ... 省略任务创建逻辑 target.afterEvaluate { // 等build.gradle里的任务参数配置完成后再执行 target.tasks.getByName("myPluginTask").execute() } }
重要注意事项
如果你的configureVersionsAndReleaseMeta方法里包含设置versionCode、声明maven仓库这类需要在配置阶段生效的逻辑,不建议放到自定义任务的@TaskAction中执行。因为自定义任务默认是执行阶段运行,此时Gradle的配置阶段已经结束,你修改的配置不会生效,这类逻辑直接放在apply方法或者afterEvaluate闭包中执行即可。
内容的提问来源于stack exchange,提问作者Murph_Fish
相关产品推荐
相关产品推荐

