14

如何在执行期间将变量传递给Exec?我想编写一个传递 gradle 文件,它将执行我当前的构建命令,让我将配置从构建服务器计划移动到源代码控制管理的 build.gradle 文件。这也是我在为更大的项目做准备时了解 gradle 的一部分。

我想使用不同的变量进行配置执行命令。在 ant 中,我会设置我的属性,然后通过嵌套的 env 块将它们传递给 exec。在 gradle 中,我正在填充一个与任务环境合并的地图,但这不起作用。

我无法将 '<<' 添加到 checkenv,因此任务代码执行之前填充的 buildEnvironmentVariables 或在错误的范围内。我知道我没有遵循正确的任务配置。

请提供建议或指出手册/文档的正确部分。

build.gradle - 执行 gradle checkenv

def buildEnvironmentVariables = [:]
task setEnv() << {
    buildEnvironmentVariables['JAVA_OPTS']="-XX:ErrorFile=foo/logs" 
}

task checkenv(dependsOn: 'printEnv', type:Exec) {
    workingDir '../..'
    executable = 'cmd'
    environment << buildEnvironmentVariables
    println "buildEnvironmentVariables = " << buildEnvironmentVariables['JAVA_OPTS']
    args = ['/c','set','JAVA_OPTS']
}

我是否应该只在项目相当于“目标”时将任务添加到项目中,并将诸如 exec 之类的操作封装在顶级任务中?

添加的任务就像 ant 目标,封装的任务就像 ant 任务?

def buildEnvironmentVariables = [:]
task setEnv() << {
    buildEnvironmentVariables['JAVA_OPTS']="-XX:ErrorFile=foo/logs" 
}

task checkenv(dependsOn: 'printEnv') << {
    println "buildEnvironmentVariables = " << buildEnvironmentVariables['JAVA_OPTS']
    ext.check = exec() {
        workingDir '../..'
        executable = 'cmd'
        environment << buildEnvironmentVariables
        args = ['/c','set','JAVA_OPTS']
    }
}

谢谢

4

2 回答 2

33

从头开始可能会更好:

task doSomething(type: Exec) {
    workingDir ...
    executable ...
    args ...
    environment JAVA_OPTS: "-XX:ErrorFile=foo/logs"
}

然后,您可以使用gradle doSomething. 这是否实现了您的目标?

于 2012-10-05T21:12:44.000 回答
6

好的,这是我最终使用 Peter N. 建议的模式所遵循的课程

  • 定义/使用检测 OS 和 Arch 的例程
  • 在配置期间为所有 exec 任务配置环境的方法
  • 示例执行任务

…………

import org.apache.tools.ant.taskdefs.condition.Os

def is64Arch() {
    return System.properties['os.arch'].toLowerCase().contains('64')
}

task configureEnvironment() {
    def envVars = [:]


    envVars['JAVA_OPTS']="-Dlog.directory=target/logs -Djava.awt.headless=true -XX:ErrorFile=target/logs"

    if (is64Arch()) 
    {
        envVars['JAVA_OPTS'] +=" -Xmx2048m -XX:MaxPermSize=768m" 
        println "*** ARCH: 64"
    }
    else
    {
        envVars['JAVA_OPTS'] +=" -Xmx1792m -XX:MaxPermSize=512m" 
        println "*** ARCH: 86"
    }

    tasks.withType(Exec) { environment << envVars }

}


task checkJavaEnvVars(type:Exec)  {
    workingDir '../..'
    commandLine 'cmd','/c','set JAVA'
}
于 2012-10-09T20:40:12.693 回答