首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何捕获groovy附加函数中的变量?

如何捕获groovy附加函数中的变量?
EN

Stack Overflow用户
提问于 2017-02-07 13:07:06
回答 1查看 309关注 0票数 2

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

代码语言:javascript
运行
复制
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代替ARTIFACT_VERSION

编辑:

添加用于帮助调试请求的代码。

代码语言:javascript
运行
复制
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}";"""
    }
}   

我的产出如下:

代码语言:javascript
运行
复制
/* Automatically generated file for marker */ 
const volatile char marker[] __attribute__ ((section ("MARKER"))) = "RPI-V2.1.2_PO3-e75ee8d 
";

我要我的输出如下:

代码语言:javascript
运行
复制
/* Automatically generated file for marker */ 
const volatile char marker[] __attribute__ ((section ("MARKER"))) = "RPI-V2.1.2_PO3-e75ee8d";
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-07 14:10:09

合并上面的答案,并在groovy中为文件和三重引号添加三重引号,我们得到:

代码语言:javascript
运行
复制
ext { 
  version_file = file('text.txt')
  ARTIFACT_VERSION ="1.0"
}

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

或者如果需要控制多行字符串的缩进级别:

代码语言:javascript
运行
复制
task genArtifactMarker {
  doLast { 
    version_file << """
     |const volatile char marker[] __attribute__ ((section ("MARKER"))) = "${ARTIFACT_VERSION}";
     |
     |more text needing correct indentation
     |""".stripMargin()
  }
}

当我们使用doLast块时,我们现在在gradle的执行阶段执行代码,而且由于我们使用的是三元引号,所以不需要在字符串中使用反斜杠字符来转义引号。

groovy stripMargin()方法可以用于获得代码中对齐良好的多行字符串,而不会影响结果字符串的格式设置。

编辑:作为对评论的响应,下面是代码的最后一个版本的输出:

代码语言:javascript
运行
复制
$ 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42090678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档