55

一連の環境変数値とシェル実行から buildsignature.properties ファイルを動的に作成する gradle タスクを実装しようとしています。ほとんど動作していますが、シェル コマンドの出力を取得できないようです。これが私のタスクです...

task generateBuildSignature << {
    ext.whoami = exec() {
        executable = "whoami"
    }
    ext.hostname = exec() {
         executable = "hostname"
    }
    ext.buildTag = System.env.BUILD_TAG ?: "dev"

    ant.propertyfile(
        file: "${buildDir}/buildsignature.properties",
        comment: "This file is automatically generated - DO NOT EDIT!" ) {
        entry( key: "version", value: "${project.version}" )
        entry( key: "buildTimestamp", value: "${new Date().format('yyyy-MM-dd HH:mm:ss z')}" )
        entry( key: "buildUser", value: "${ext.whoami}" )
        entry( key: "buildSystem", value: "${ext.hostname}" )
        entry( key: "buildTag", value: "$ext.buildTag" )
    }
}

しかし、結果のプロパティ フィールドは、buildUser と buildSystem の望ましい結果を取得しません。

#This file is automatically generated - DO NOT EDIT!
#Mon, 18 Jun 2012 18:14:14 -0700
version=1.1.0
buildTimestamp=2012-06-18 18\:14\:14 PDT
buildUser=org.gradle.process.internal.DefaultExecHandle$ExecResultImpl@2e6a54f9
buildSystem=org.gradle.process.internal.DefaultExecHandle$ExecResultImpl@46f0bf3d
buildTag=dev

デフォルトの ExecResultImpl toString ではなく、対応する exec の出力と一致するように buildUser と buildSystem を取得するにはどうすればよいですか? これは本当に難しいことではありませんよね?

4

6 に答える 6

73

これは、exec から stdout を取得するための私の推奨構文です。

def stdout = new ByteArrayOutputStream()
exec{
    commandLine "whoami"
    standardOutput = stdout;
}
println "Output:\n$stdout";

ここにあります: http://gradle.1045684.n5.nabble.com/external-process-execution-td1431883.html (ただし、ページにはタイプミスがあり、ByteArrayOutputStream の代わりに ByteArrayInputStream が言及されていることに注意してください)

于 2012-12-01T16:42:03.477 に答える
60

この投稿Execでは、呼び出しからの出力を解析する方法について説明します。以下に、コマンドを実行する 2 つのタスクがあります。

task setWhoamiProperty {
    doLast {
        new ByteArrayOutputStream().withStream { os ->
            def result = exec {
                executable = 'whoami'
                standardOutput = os
            }
            ext.whoami = os.toString()
        }
    }
}

task setHostnameProperty {
    doLast {
        new ByteArrayOutputStream().withStream { os ->
            def result = exec {
                executable = 'hostname'
                standardOutput = os
            }
            ext.hostname = os.toString()
        }
    }
}

task printBuildInfo {
    dependsOn setWhoamiProperty, setHostnameProperty
    doLast {
         println whoami
         println hostname
    }
}

実際には、シェル コマンドを呼び出さずにこの情報を取得する簡単な方法があります。

現在ログインしているユーザー:System.getProperty('user.name')

ホスト名:InetAddress.getLocalHost().getHostName()

于 2012-06-19T02:53:42.557 に答える