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

时间:2014-06-03 18:25:45

标签: gradle

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

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

5 个答案:

答案 0 :(得分:7)

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

ext {
    nativeType = "dmg"
    bundleAppName = 'My App'
}

project.ext {
    nativeType = "dmg"
    bundleAppName = 'My App'
}

它应该有用。 从我收集的内容来看,这是一个范围问题 - 在第一种情况下,您为Task设置了属性,在第二种情况下,为Project设置了属性。


顺便说一下,我认为buildAppBundle.mustRunAfter macBundleConfig对你来说运行得太晚,因为它是buildMacBundle任务的一部分,所以运行顺序为:

  1. macBundleConfig
  2. buildAppBundle
  3. buildMacBundle
  4. 仅在3期内,mustRunAfter的配置buildAppBundle将会更改。

答案 1 :(得分:1)

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

答案 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']    

请参阅enter image description here

答案 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