2012-06-19 15 views
30

私は、一連の環境変数値とシェル実行からbuildsignature.propertiesファイルを動的に作成するためのgradleタスクを実装しようとしています。私は主に動作しているが、シェルコマンドの出力を得ることができない。ここに私の仕事です...graleのexec()出力の使用方法

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 
buildUs[email protected]2e6a54f9 
buildSyst[email protected]46f0bf3d 
buildTag=dev 

にはどうすればいいbuildUserとビルドシステムが対応するexecのではなく、いくつかのデフォルトExecResultImplのtoStringの出力と一致するのですか?これは本当に難しいことではありませんか?

答えて

28

このpostは、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()

+0

簡単です。私は本当に出力ストリームを手で解析するシェルコマンドの出力をキャプチャすることを期待していませんでした。どんなに。ガイダンスをありがとう。 –

+3

簡単な質問ですが、あなたのコードに 'standardOutput = os'がありませんか? –

+0

これを行うと、非同期であるようです。 whoamiとhostnameが存在する前に出力しようとします。アイデア? –

50

これはある幹部から標準出力を取得するための私の好みの構文:ここ

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を記述する)

+0

gradle 3.3:これは動作しません。 printlnに何も起こっていないとコメントした場合、コメントアウトすると出力に新しい行がたくさんありますが、それは奇妙ですが "出力"という単語もありません – Tertium

2

言い換えればGradle docs for Exec

task execSomething { 
    exec { 
    workingDir '/some/dir' 
    commandLine '/some/command', 'arg' 

    ... 
    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    //extension method execSomething.output() can be used to obtain the output: 
    ext.output = { 
     return standardOutput.toString() 
    } 
    } 
} 
関連する問題