我想设置一个"泛型"任务将为许多平台构建应用程序包(它使用javafxpackager)。任务的机制适用于创建所有平台捆绑包,但不同之处在于任务使用的各种属性。
我原本以为我会为每个平台创建单独的更高级别任务,其中将设置平台特定属性,然后调用/执行/(在此处替换正确的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
}
}
但是当我运行&#34; buildMacBundle&#34;时,我得到了
* What went wrong:
Execution failed for task ':buildAppBundle'.
> cannot get property 'nativeType' on extra properties extension as it does not exist
如何定义特定任务中的属性,然后调用通用任务?
答案 0 :(得分:7)
我遇到了类似的问题,我发现如果你切换
ext {
nativeType = "dmg"
bundleAppName = 'My App'
}
与
project.ext {
nativeType = "dmg"
bundleAppName = 'My App'
}
它应该有用。
从我收集的内容来看,这是一个范围问题 - 在第一种情况下,您为Task
设置了属性,在第二种情况下,为Project
设置了属性。
顺便说一下,我认为buildAppBundle.mustRunAfter macBundleConfig
对你来说运行得太晚,因为它是buildMacBundle
任务的一部分,所以运行顺序为:
仅在3期内,mustRunAfter
的配置buildAppBundle
将会更改。
答案 1 :(得分:1)
任务不应该配置东西。这就是构建脚本和插件的用途。您可能需要的是任务类型(即作为类实现的任务“模板”),它具有一些基于的配置属性(nativeType
,bundleAppName
等)它创建了一个应用程序包。然后,构建脚本或插件可以声明该类型的多个任务(例如,每个平台一个)并根据需要进行配置。或者,您也可以实现多个任务类型,可能会扩展一个公共基类。
答案 2 :(得分:1)
我解决了这个问题:
gradle.taskGraph.whenReady {taskGraph ->
if (taskGraph.hasTask(buildMacBundle)) {
project.ext.nativeType = "dmg"
} else if (taskGraph.hasTask(buildWindowsBundle)){
project.ext.nativeType = "exe"
}
}
对我而言,这是最简单的方法,但远非直观。
中有大量的谷歌搜索偶然发现了这一点用户指南:6.13。由DAG配置(无论DAG是什么?)
我怀疑有一种更简单的方法,但它肯定不是在编写插件。如果我要在多个build.gradle脚本中创建一些东西,我会认为插件是正确的方法,但是在这里,只有一个build.gradle构建脚本,它太过分了。
答案 3 :(得分:1)
您可以尝试创建GradleBuild Task并使用给定的项目属性调用所需的任务。
task someTask(type: GradleBuild) {
tasks = ['taskToParametrize']
startParameter.projectProperties = ['parameterName': 'parameterValue']
}
然后你可以查询属性:
project.properties['parameterName']
答案 4 :(得分:0)
我遇到了这个解决方案:
task meta1 {
doLast {
user.property="variant1"
}
}
task meta2 {
doLast {
user.property="variant2"
}
}
meta1.finalizedBy buildTask
meta2.finalizedBy buildTask
buildTask
是执行任务的任务,在此示例中,必须在任务运行以配置目标配置之前设置user.property
。有两个meta任务,每个meta任务都会为属性设置适当的值,然后要求通过finalizedBy
命令在其后运行build任务。
Gradle