gradle任务缩写仅支持前缀唯一匹配:输入字符串必须是某任务名的最短前缀,且在当前上下文(根项目或指定子项目)中不与其他任务名冲突;register声明的延迟任务默认不参与缩写匹配。

Gradle 任务名缩写只支持前缀匹配,不支持模糊或中间匹配
Gradle 命令行对任务名的缩写是「前缀唯一性匹配」:只要输入的字符串是某个任务名的**最短前缀**,且在整个项目(含所有子项目)中**不与其他任务名冲突**,就能成功解析。不是“越短越好”,而是“刚好够区分”。
-
gradle bu可能匹配build,但若同时存在buildSrc和buildCache,就会报错:Task 'bu' is ambiguous in root project - 缩写不跨项目生效——
gradle app:b不会匹配:app:build,因为b在:app下不唯一(比如还有:app:bootRun) - 多项目中,缩写始终在**当前执行上下文范围**内解析;从根目录运行时,它检查所有已配置项目的全部任务名(包括
:sub1:taskX、:sub2:taskY)
常见缩写失败场景和错误信息
实际执行时最常遇到的是 Unknown task 或 ambiguous,根本原因不是拼错,而是缩写未满足唯一性。
-
gradle test在有test和testFixtures的项目中会失败,报错:Task 'test' is ambiguous in root project -
gradle c在有clean、compileJava、check的项目里必然失败——三个都以c开头 - 子项目任务缩写必须带路径前缀才能限定范围,例如
gradle app:as才可能匹配:app:assemble,单独as仍会全局搜索
如何快速验证缩写是否有效
别靠猜,用 gradle tasks --all 或 gradle -q tasks --all 列出所有注册任务名,再人工检查前缀唯一性。注意输出中的完整路径(如 :app:generateDebugBuildConfig),缩写必须覆盖到能排除其他同前缀任务的程度。
- 想缩写
:app:assembleRelease?先确认:app下没有assembleDebug或assembleBeta——否则gradle app:as仍会歧义 - 根项目有
build,子项目:lib也有build,那么gradle b会同时匹配二者,直接失败;必须写全gradle build或指定路径gradle :lib:build -
gradle -q tasks --all | grep "^:"可快速过滤出带路径的任务,辅助判断缩写边界
register 创建的任务默认不参与缩写匹配
用 tasks.register('myTask') { ... } 声明的任务,在 Gradle 5.0+ 中属于延迟创建(lazy configuration),**不会出现在 gradle tasks 输出里,也不会被缩写机制识别**,除非它已被显式引用(如通过 dependsOn 或 getByName)触发创建。
- 这意味着你写了
tasks.register('uploadArtifacts'),却试图用gradle up运行——会报Unknown task 'up',不是缩写问题,是任务根本没注册进名称空间 - 要让缩写生效,要么改用
tasks.create('uploadArtifacts'),要么在脚本中加一句tasks.named('uploadArtifacts')强制提前注册 - 这也是为什么
gradle tasks输出列表和实际可运行任务数有时不一致——register的任务得“被看见”才真正存在











