2010-12-15 40 views
14

我們使用Hudson來構建我們的項目,Hudson在編譯時方便地定義了諸如「%BUILD_NUMBER%」之類的環境變量。我可以從編譯時env變量在csharp中創建一個常量嗎?

我想在代碼中使用該變量,因此我們可以執行諸如記錄運行時構建的內容。但是我不能這樣做System.Environment.GetEnvironmentVariable,因爲這是訪問運行時環境,我想是這樣的:

#define BUILD_NUM = %BUILD_NUMBER% 

const string BUILD_NUM = %BUILD_NUMBER% 

除了我不知道語法。有人可以請指點我正確的方向嗎?謝謝!

+0

您可以使用預生成操作/宏來更改數字,這是一個選項嗎? – Bobby 2010-12-15 13:16:42

+0

我一直希望有一些東西不需要每次修改文件,輸入源文件保持不變,並且當前值被插入到編譯後的輸出中。 – 2010-12-15 14:59:46

回答

16

好的,這是我最終做的。這不是很優雅,但它的作品。我創建了一個預構建的步驟,如下所示:

echo namespace Some.Namespace > "$(ProjectDir)\CiInfo.cs" 
echo { >> "$(ProjectDir)\CiInfo.cs" 
echo  ///^<summary^>Info about the continuous integration server build that produced this binary.^</summary^> >> "$(ProjectDir)\CiInfo.cs" 
echo  public static class CiInfo >> "$(ProjectDir)\CiInfo.cs" 
echo  { >> "$(ProjectDir)\CiInfo.cs" 
echo   ///^<summary^>The current build number, such as "153"^</summary^> >> "$(ProjectDir)\CiInfo.cs" 
echo   public const string BuildNumber = ("%BUILD_NUMBER%" == "" ? @"Unknown" : "%BUILD_NUMBER%"); >> "$(ProjectDir)\CiInfo.cs" 
echo   ///^<summary^>String of the build number and build date/time, and other useful info.^</summary^> >> "$(ProjectDir)\CiInfo.cs" 
echo   public const string BuildTag = ("%BUILD_TAG%" == "" ? @"nohudson" : "%BUILD_TAG%") + " built: %DATE%-%TIME%"; >> "$(ProjectDir)\CiInfo.cs" 
echo  } >> "$(ProjectDir)\CiInfo.cs" 
echo } >> "$(ProjectDir)\CiInfo.cs" 

然後我說「CiInfo.cs」的項目,但是從版本控制忽略了它。這樣我就不必編輯它或提交它,而且項目始終有一個可用的常量,即最新的內部版本號和時間。

+1

多麼方便的解決方案! – 2012-04-29 23:48:00

+0

謝謝。我將它作爲一個批處理文件,然後從批處理文件中調用它,並使用路徑傳入文件名,並使用%1作爲重定向,如果批處理中的大多數可以更容易維護,則可以更容易地維護: '$( ProjectDir)\ Tools \ BuildCI.bat「$(ProjectDir)\ CiInfo.cs」' – 2014-09-10 20:36:29

+0

我喜歡這個。這麼簡單,沒有插件!謝謝。 – arkod 2016-02-26 12:50:15

6

執行此操作的一種方法是在編譯之前添加一個構建步驟,該構建步驟在適當的源文件中替換爲%BUILD_NUMBER%的正則表達式。

+0

+1,儘管在過去當我完成它時,我只是將'.config'文件作爲一個設置,然後剩下的代碼就可以從那裏訪問它。 – 2010-12-15 13:45:00

+0

這大致是我們目前所做的(儘管不是源文件),我希望我可以直接在代碼中直接訪問它,但因爲它更簡單,不易出錯,並且不會顯示爲更改vs 。svn倉庫。 – 2010-12-15 14:52:05

1

define不允許你在C#中定義接觸,就像你可以在C/C++中一樣。

this page來自:

#define指令不能被用於聲明如在C和C通常所做++恆定值。 C#中的常量最好定義爲類或結構的靜態成員。如果你有幾個這樣的常量,可以考慮創建一個單獨的「常量」類來保存它們。

如果您希望反映AssemblyInfo類中的內部版本號,大多數構建工具都支持在構建時生成該類。 MSBuild has a taskAs does NAnt。不確定哈德森如何做到這一點。

1

其中一種可能性是使用T4來生成具有實例化所有常量的配置類。 T4很好地集成到MSVS中,不需要您自己的定製構建步驟。

相關問題