在自定义插件的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
除了如何我真的想知道为什么吗?
您可以设置该属性之后您调用apply
如果移动
version = "1.0.0"
要前行
apply plugin: MyPlugin
它应该工作
编辑
继彼得的回答 ,您可以看到这个作品也:
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
直至构建完成评估
与评估顺序,亦是挑战编写插件的时候,它需要一定的知识和专业知识的掌握。
请注意,在构建脚本,插件被应用(因此执行!)为之前的版本。 这是常态,和插件有对付它。 粗略地说,每当插件访问摇篮对象模型的一个可变的属性,它有推迟的访问,直到配置阶段结束。 (在此之前,该属性的值仍然可以更改。)
有些摇篮API的(懒惰的集合,方法接受回调等)提供了解决这一问题的特别支持。 除此之外,您可以在包装受影响的代码project.gradle.projectsEvaluated { ... }
或者使用更复杂的“公约映射”技术。
该摇篮用户指南和http://forums.gradle.org提供有关这些主题的更多信息。
检查我的答案在这里
您可以在projectEvaluated关闭或afterTask结束后把这个块。 我没有测试只是纯粹的独立,但它可能工作。
AppExtension android = (AppExtension) project.extensions.findByName("android")
String versionName = android.defaultConfig.versionName
String versionCode = android.defaultConfig.versionCode