Gradle 如何在groovy append函数中捕获变量?

Gradle 如何在groovy append函数中捕获变量?,gradle,groovy,Gradle,Groovy,我正在编写一个Gradle任务,为生成的可执行文件定义一个全局工件标记。此任务将创建一个C文件,该文件稍后将打包到包含其他源的可执行文件中 task genArtifactMarker{ project.ext.HASH = "git rev-parse --short HEAD".execute().text project.ext.ARTIFACT_VERSION = "$PROJECT-$VERSION-$HASH" def version_

我正在编写一个Gradle任务,为生成的可执行文件定义一个全局工件标记。此任务将创建一个
C
文件,该文件稍后将打包到包含其他源的可执行文件中

task genArtifactMarker{
        project.ext.HASH = "git rev-parse --short HEAD".execute().text
        project.ext.ARTIFACT_VERSION = "$PROJECT-$VERSION-$HASH"
        def version_file = new File('version.c')
        version_file.append('\n/* Automatically generated file for marker */')
        version_file.append('\nconst volatile char marker[] __attribute__ ((section ("MARKER"))) = "${ARTIFACT_VERSION}";')
}
如何在append函数中捕获
ARTIFACT\u VERSION
变量?我想要像
MY_EXE-V2.1.2-47add78
这样的东西来代替生成的
VERSION.c
文件中的
ARTIFACT\u VERSION

编辑:

添加代码以帮助请求调试

task genArtifactMarker{
    doLast{
        project.ext.HASH = "git rev-parse --short HEAD".execute().text
        def ARTIFACT_VERSION = "$PROJECT-$VERSION-$HASH"
        def version_file = new File('version.c')
        version_file.append('\n/* Automatically generated file for marker */')
        version_file << """\nconst volatile char marker[] __attribute__ ((section ("MARKER"))) = "${ARTIFACT_VERSION}";"""
    }
}   
我希望我的输出如下:

/* Automatically generated file for marker */ 
const volatile char marker[] __attribute__ ((section ("MARKER"))) = "RPI-V2.1.2_PO3-e75ee8d";

您需要使用双引号来获取模板:

version_file.append("\nconst volatile char marker[] __attribute__ ((section (\"MARKER\"))) = \"${ARTIFACT_VERSION}\";")

结合上述答案并添加for文件,在groovy中我们得到:

ext { 
  version_file = file('text.txt')
  ARTIFACT_VERSION ="1.0"
}

task genArtifactMarker {
  doLast { 
    version_file << """\nconst volatile char marker[] __attribute__ ((section ("MARKER"))) = "${ARTIFACT_VERSION}";"""
  }
}

您正在gradle的配置阶段完成“工作”,而这应该在执行阶段完成。用
doLast{…}
closurePoint将逻辑包装起来。谢谢,谢谢。它起作用了。但是我得到了最后的
”;
(在新的一行结束双引号和分号)。另外,\反斜杠的确切意义是什么?非常感谢你的回答。但是我仍然无法得到
与C语句位于同一行。我已经复制粘贴了两个版本的代码。知道我做错了什么吗?我已经用最新的代码更新了我的问题。添加了一个编辑,其中包含我在执行任务时获得的输出。它真的应该把
放在同一行上。谢谢。问题在于git命令的输出。我的git rev parse后面有很多空格。因此,我做了一个
project.ext.HASH=“git rev parse--short HEAD.execute().text.replaceAll(\\s“,”)
摆脱它。现在我所有的东西都在同一条线上了。
ext { 
  version_file = file('text.txt')
  ARTIFACT_VERSION ="1.0"
}

task genArtifactMarker {
  doLast { 
    version_file << """\nconst volatile char marker[] __attribute__ ((section ("MARKER"))) = "${ARTIFACT_VERSION}";"""
  }
}
task genArtifactMarker {
  doLast { 
    version_file << """
     |const volatile char marker[] __attribute__ ((section ("MARKER"))) = "${ARTIFACT_VERSION}";
     |
     |more text needing correct indentation
     |""".stripMargin()
  }
}
$ ls -l
total 4
-rw-r--r-- 1 mbjarland mbjarland 628 Feb  7 15:08 build.gradle

$ gradle genArtifactMarker
:genArtifactMarker

BUILD SUCCESSFUL

Total time: 1.102 secs

$ ls -l
total 8
-rw-r--r-- 1 mbjarland mbjarland 628 Feb  7 15:08 build.gradle
-rw-r--r-- 1 mbjarland mbjarland 115 Feb  8 15:26 text.txt

$ cat text.txt 

const volatile char marker[] __attribute__ ((section ("MARKER"))) = "1.0";

more text needing correct indentation