在自定义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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印出来:
%> gradle -q myTask
In plugin: unspecified
In build file: 1.0.0
Run Code Online (Sandbox Code Playgroud)
除了我真的想知道为什么?
tim*_*tes 10
您在致电后设置了该属性 apply
如果你搬家
version = "1.0.0"
Run Code Online (Sandbox Code Playgroud)
到了之前
apply plugin: MyPlugin
Run Code Online (Sandbox Code Playgroud)
它应该工作
按照Peter的回答,您可以看到这也有效:
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"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
延迟评估,$project.version直到构建评估完成
与评估顺序处理是在挑战编写插件的时候,它需要一定的知识和专业知识的掌握.
请注意,在构建脚本中,插件会在设置版本之前应用(并因此执行!).这是常态,插件必须处理它.粗略地说,只要插件访问Gradle对象模型的可变属性,就必须将该访问推迟到配置阶段结束.(在那之前,财产的价值仍然可以改变.)
Gradle的一些API(惰性集合,接受回调的方法等)为处理此问题提供了特殊支持.除此之外,您可以包含受影响的代码project.gradle.projectsEvaluated { ... },或使用更复杂的"约定映射"技术.
该摇篮用户指南和http://forums.gradle.org提供有关这些主题的更多信息.
| 归档时间: |
|
| 查看次数: |
7588 次 |
| 最近记录: |