我想设置一个"通用"任务,它将为许多平台构建应用程序包(它使用javafxpackager).任务的机制适用于创建所有平台捆绑包,但不同之处在于任务使用的各种属性.
我原本以为我会为每个平台创建单独的更高级别任务,在这些平台中将设置特定于平台的属性,然后在通用任务中调用/ execute /(替换正确的gradle术语).例如,
task buildMacBundle(dependsOn: ['macBundleConfig', 'buildAppBundle']) << {
// set Mac-specific properties (project.ext properties?)
// call/invoke/execute or whatever the mechanism is called, buildAppBundle task
buildAppBundle.mustRunAfter macBundleConfig
println "building a Mac app bundle"
}
task macBundleConfig << {
println "executing macBundleConfig"
ext {
nativeType = "dmg"
bundleAppName = 'My App'
}
delete ("${buildDir.name}/dist/${bundleAppName}.dmg")
}
task buildWindowsBundle << {
// omitted for brevity, but just like buildMacBundle except for property values
}
task buildAppBundle << {
println "nativeType: ${project.ext.nativeType}" // it stumbles here!
def cmd = [
"${javapackager}",
"-deploy",
"-native", "${project.ext.nativeType}",
"-name",
"${project.bundleAppName}",
"-outdir",
"${buildDir.name}${File.separator}dist",
"-outfile",
"MyApp",
"-srcdir",
"${buildDir.name}${File.separator}${libsDir.name}",
"-appclass",
"org.pf.app.MyApp"
]
println cmd.join(" ")
def javapackager = exec {
workingDir "${project.projectDir.absolutePath}"
commandLine cmd
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行"buildMacBundle"时,我得到了
* What went wrong:
Execution failed for task ':buildAppBundle'.
> cannot get property 'nativeType' on extra properties extension as it does not exist
Run Code Online (Sandbox Code Playgroud)
如何在特定任务中定义属性然后调用通用任务?
我遇到了类似的问题,我发现如果你换了
ext {
nativeType = "dmg"
bundleAppName = 'My App'
}
Run Code Online (Sandbox Code Playgroud)
同
project.ext {
nativeType = "dmg"
bundleAppName = 'My App'
}
Run Code Online (Sandbox Code Playgroud)
它应该工作.从我收集的内容来看,这是一个范围问题 - 在第一种情况下,你设置属性Task,在第二种情况下,为Project.
顺便说一下,我认为这buildAppBundle.mustRunAfter macBundleConfig对你来说太晚了,因为它是buildMacBundle任务的一部分,所以运行的顺序是:
并且仅在3将配置mustRunAfter的buildAppBundle将被改变.
我用这个解决了它:
gradle.taskGraph.whenReady {taskGraph ->
if (taskGraph.hasTask(buildMacBundle)) {
project.ext.nativeType = "dmg"
} else if (taskGraph.hasTask(buildWindowsBundle)){
project.ext.nativeType = "exe"
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这是最简单的方法,但远非直观。经过大量的谷歌搜索才偶然发现了这一点
用户指南:6.13。通过 DAG 配置(DAG 是什么?)
我怀疑有一种更简单的方法,但肯定不是编写插件。如果我要创建一些在多个 build.gradle 脚本中使用的东西,我会认为插件是正确的选择,但在这里,仅在一个 build.gradle 构建脚本中,它就太过分了。
任务不应该配置东西。这就是构建脚本和插件的用途。您可能想要的是一个任务类型(即作为类实现的任务“模板”),该类型具有一些配置属性(nativeType、bundleAppName等),并根据这些属性创建应用程序包。然后,构建脚本或插件可以声明该类型的多个任务(例如,每个平台一个)并根据需要配置它们。或者,您还可以实现多种任务类型,或许可以扩展一个公共基类。
| 归档时间: |
|
| 查看次数: |
14734 次 |
| 最近记录: |