在自定义gradle插件中,project.version
似乎始终为unspecified
。为什么以及如何在自定义插件(类)中检索project.version
?
例如:
apply plugin: 'java'
apply plugin: MyPlugin
version = "1.0.0"
println "In build file: $project.version"
class MyPlugin implements Plugin<Project> {
public void apply(Project project) {
project.task('myTask') {
println "In plugin: $project.version"
}
}
}
打印出来:
%> gradle -q myTask
In plugin: unspecified
In build file: 1.0.0
除了我真的想知道为什么?
答案 0 :(得分:10)
您在致电apply
如果你移动
version = "1.0.0"
到行前
apply plugin: MyPlugin
应该有效
Following Peter's answer,您可以看到这也有效:
apply plugin: 'java'
apply plugin: MyPlugin
version = "1.0.0"
println "In build file: $project.version"
class MyPlugin implements Plugin<Project> {
public void apply(Project project) {
project.task('myTask') {
project.gradle.projectsEvaluated {
println "In plugin: $project.version"
}
}
}
}
延迟评估$project.version
,直到评估构建完成
答案 1 :(得分:5)
在编写插件时,处理评估顺序是 挑战,需要掌握一些知识和专业知识。
请注意,在构建脚本中,插件会在设置版本之前应用(并因此执行!)。这是常态,插件必须处理它。粗略地说,只要插件访问Gradle对象模型的可变属性,就必须将该访问推迟到配置阶段结束。 (在那之前,财产的价值仍然可以改变。)
Gradle的一些API(延迟集合,接受回调的方法等)为处理此问题提供了特殊支持。除此之外,您可以将受影响的代码包装在project.gradle.projectsEvaluated { ... }
中,或使用更复杂的“约定映射”技术。
Gradle User Guide和http://forums.gradle.org提供了有关这些主题的更多信息。
答案 2 :(得分:0)
检查我的回答here
您可以在projectEvaluated闭包或afterTask闭包之后放置此块。我没有测试纯粹的独立,但它可能有用。
AppExtension android = (AppExtension) project.extensions.findByName("android")
String versionName = android.defaultConfig.versionName
String versionCode = android.defaultConfig.versionCode