Подтвердить что ты не робот

Как использовать вывод exec() в gradle

Я пытаюсь реализовать задачу gradle для динамического создания файла buildsignature.properties из серии значений переменных среды и выполнения оболочки. У меня это в основном работает, но я не могу получить вывод команд оболочки. Здесь моя задача...

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 и buildSystem для соответствия выводам соответствующего exec, а не некоторого по умолчанию ExecResultImpl toString? Это действительно не может быть так сложно, не так ли?

4b9b3361

Ответ 1

Этот post описывает, как анализировать вывод из вызова Exec. Ниже вы найдете две задачи, которые запускают ваши команды.

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()

Ответ 2

Это мой предпочтительный синтаксис для получения stdout из exec:

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

Найдено здесь: http://gradle.1045684.n5.nabble.com/external-process-execution-td1431883.html (Обратите внимание, что страница имеет опечатку и упоминает ByteArrayInputStream вместо ByteArrayOutputStream)

Ответ 3

Перефразировано из Gradle docs для 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()
    }
  }
}