如何设置从属gradle任务的属性

pfu*_*her 6 gradle

我想设置一个"通用"任务,它将为许多平台构建应用程序包(它使用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)

如何在特定任务中定义属性然后调用通用任务?

ori*_*rab 7

我遇到了类似的问题,我发现如果你换了

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任务的一部分,所以运行的顺序是:

  1. macBundleConfig
  2. buildAppBundle
  3. buildMacBundle

并且仅在3将配置mustRunAfterbuildAppBundle将被改变.


pfu*_*her 5

我用这个解决了它:

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 构建脚本中,它就太过分了。


Pet*_*ser 0

任务不应该配置东西。这就是构建脚本和插件的用途。您可能想要的是一个任务类型(即作为类实现的任务“模板”),该类型具有一些配置属性(nativeTypebundleAppName等),并根据这些属性创建应用程序包。然后,构建脚本或插件可以声明该类型的多个任务(例如,每个平台一个)并根据需要配置它们。或者,您还可以实现多种任务类型,或许可以扩展一个公共基类。

  • 举个例子会很有帮助。仅从答案来看,我不知道如何开始。这使得这个答案成为最没有帮助的答案之一,尽管它可能是最好的。 (13认同)