创建一个gradleKotlin任务来运行命令行并将输出保存到文件

pnwntuvh  于 2023-08-06  发布在  Kotlin
关注(0)|答案(1)|浏览(123)

我正在尝试将git commit hash发布到prometheus,为此我需要获取以下命令的输出并保存到文件。

git rev-parse HEAD

字符串
我想保存到gitReleaseVersion.txt
我在android here上发现了一些类似的帖子,但我无法将其翻译为Kotlingradle。
这是我所拥有的,但它没有创建任何文件。

task<Exec>("getVersionInfo"){
    doLast {
        exec {
            commandLine("git rev-parse HEAD > gitReleaseVersion.txt")
        }
    }
}


输出:无错误,无文件
也尝试过

task<Exec>("getVersionInfo"){
    val logFile = file("src/main/resources/gitReleaseVersion.txt")
    exec {
        commandLine("git rev-parse HEAD").standardOutput.to(logFile)
    }
}


输出量:
无法运行程序“git rev-parse HEAD”(在目录“/Users/kaigo/code/core/module/base/function-base”中):error=2,没有这样的文件或目录
该文件确实存在,如果我打印文件路径,链接将解析为该文件。

roqulrg3

roqulrg31#

  1. exec {}立即运行可执行文件。如果您想定义一个Exec任务,那么不要使用exec {},而是配置您的自定义getVersionInfo任务。
    如果你想在一个任务中运行多个命令,使用exec {}是很好的,但是这里你只使用了一个。
    1.需要将参数分割成一个列表,或者(如果可用)使用parseSpaceSeparatedArgs()实用程序。
    1.将输出通过管道传送到文件。Git会将>解释为它自己的参数,你会得到一个类似fatal: ambiguous argument '>': unknown revision or path not in the working tree的错误。
    相反,capture the output并将其写入文件。
    1.注册任务输入和输出是一个好主意,这样Gradle就能够监控任务,并避免在没有任何变化的情况下重新运行它们。
    在应用这些更新后,您将获得如下内容:
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
import java.io.ByteArrayOutputStream

val getVersionInfo by tasks.registering(Exec::class) {
  executable("git")
  args(parseSpaceSeparatedArgs("rev-parse HEAD"))
  // or manually pass a list
  //args("rev-parse", "HEAD")

  val gitReleaseVersionOutput = layout.projectDirectory.file("gitReleaseVersion.txt")
  outputs.file(gitReleaseVersionOutput)

  // capture the standard output
  standardOutput = ByteArrayOutputStream()

  doLast {
    // after the task has run save the standard output to the output file
    val capturedOutput = standardOutput.toString()
    gitReleaseVersionOutput.asFile.apply {
      parentFile.mkdirs()
      createNewFile()
      writeText(capturedOutput)
    }
  }
}

字符串
Be aware that this implementation is not compatible with Configuration Cache,并将导致这些错误:

> Task :getVersionInfo FAILED
bc00f347a22805f720fd975304b31335bd5fb665

2 problems were found storing the configuration cache.
- Task `:gitVersion` of type `org.gradle.api.tasks.Exec`: cannot deserialize object of type 'java.io.OutputStream' as these are not supported with the configuration cache.
  See https://docs.gradle.org/8.2/userguide/configuration_cache.html#config_cache:requirements:disallowed_types
- Task `:getVersionInfo` of type `org.gradle.api.tasks.Exec`: cannot serialize object of type 'java.io.ByteArrayOutputStream', a subtype of 'java.io.OutputStream', as these are not supported with the configuration cache.
  See https://docs.gradle.org/8.2/userguide/configuration_cache.html#config_cache:requirements:disallowed_types

相关问题