【问题标题】:How can I Pass environment to gradle exec如何将环境传递给 gradle exec
【发布时间】:2012-10-05 20:51:43
【问题描述】:

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

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

我无法在 checkenv 中添加“

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

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 target,封装任务类似于ant task?

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']
    }
}

谢谢

【问题讨论】:

    标签: gradle


    【解决方案1】:

    从头开始可能会更好:

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

    然后您可以使用gradle doSomething 运行此任务。这是否实现了您的目标?

    【讨论】:

    • 接近它。我想要一个 setenv 来确定操作系统并相应地设置环境以及一个通用的 runCommand 任务。猜猜,我可以将基于操作系统的环境设置捆绑到一个任务中,但感觉这会将不同的问题结合在一个代码块中(虽然我很迂腐)。
    • 实际上,我真正应该做的是创建一个自定义任务“BuildShell”,它会自动在 cmd 或 sh 之间进行选择并接受额外的环境映射。这就是我们在 ant 中处理此问题的方式,我可以更轻松地在 gradle 中进行复制。
    • 在 Gradle 中,您通常在 配置阶段 做出此类决定,而无需使用单独的任务。例如,您可以执行tasks.withType(Exec) { environment ... } 之类的操作来一次性配置所有Exec 任务。
    • 哦,那太好了。谢谢彼得。我会遵循这个模式。我感觉我混淆了这两个阶段。
    • 此处包含了 Peter Niederwieser 的一些建议的类似主题:stackoverflow.com/questions/27530263/…
    【解决方案2】:

    好的,这是我最终使用 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'
    }
    

    【讨论】:

    • configureEnvironment 应该是一种方法,而不是一项任务。导入似乎已过时。
    • 实际上,我最终将整个想法纳入了一个插件和一个自定义任务来设置 env 然后运行 ​​exec。尽管将 STDerr 和 STDout 都捕获到日志中,但它工作得很好,但仍然证明很棘手,因为 exec 似乎没有提供重定向。
    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多