我正在编写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}";')
}
如何在追加函数中捕获ARTIFACT_VERSION
变量?在我生成的MY_EXE-V2.1.2-47add78
文件中,我想要ARTIFACT_VERSION
代替version.c
。
修改
添加代码以帮助请求调试。
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
";
我想要输出如下:
/* Automatically generated file for marker */
const volatile char marker[] __attribute__ ((section ("MARKER"))) = "RPI-V2.1.2_PO3-e75ee8d";
答案 0 :(得分:2)
您需要使用双引号来获取模板:
version_file.append("\nconst volatile char marker[] __attribute__ ((section (\"MARKER\"))) = \"${ARTIFACT_VERSION}\";")
答案 1 :(得分:1)
合并上述答案并在文件中添加<<
append operator并在groovy中添加triple double quoted strings:
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()
}
}
当我们使用doLast
块时,我们现在在gradle的执行阶段执行代码,因为我们使用三引号,所以我们不需要在字符串中使用反斜杠字符来转义引号。
groovy 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