2017-02-07 30 views
2

我在寫一個Gradle任務來爲我的可執行文件定義一個全局工件標記。此任務將創建一個C文件,該文件稍後將打包到包含其他來源的可執行文件中。如何在groovy append函數中捕獲變量?

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_VERSION變量?我想在我生成的version.c文件中使用MY_EXE-V2.1.2-47add78代替ARTIFACT_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 
"; 

我想我的輸出如下:

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

你正在做的gradle產出的配置階段的「工作」時,應在執行階段來完成。將你的邏輯封裝在一個'doLast {...}'關閉 –

+0

注意點。謝謝。 –

回答

1

合併上述答案並添加<< append operator文件和triple double quoted strings在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}";""" 
    } 
} 

,或者如果你需要控制一個多行字符串的縮進級別:

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 
+0

非常感謝你的回答,但是我仍然無法獲得'' ;'在C語句的同一行上。我有複製粘貼你的代碼的兩個版本。任何想法我做錯了什麼?我用最新的代碼更新了我的問題。 –

+1

添加了一個編輯和執行任務時獲得的輸出。它真的應該粘在同一行上的''''和';' –

+0

謝謝。問題在於git命令的輸出。我的git rev-parse帶有很多尾隨的空格,所以我做了' project.ext.HASH =「git rev-parse --short HEAD」.execute()。text.replaceAll(「\\ s」,「」)'擺脫它。現在我擁有同一行上的所有內容。 –

2

您需要用雙引號,以獲得模板:

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

謝謝。有用。但是我得到了最後的'';'(在一個新行上加上雙引號和分號),另外,\ backslashes的意義究竟是什麼? –