我可以从csharp中的编译时env变量中创建一个常量吗?

Egg*_*eff 16 c# environment-variables compile-time

我们使用Hudson来构建我们的项目,Hudson在编译时方便地定义了像"%BUILD_NUMBER%"这样的环境变量.

我想在代码中使用该变量,因此我们可以在运行时记录这是什么构建.但是我不能做System.Environment.GetEnvironmentVariable,因为那是访问运行时环境,我想要的是这样的:

#define BUILD_NUM = %BUILD_NUMBER%
Run Code Online (Sandbox Code Playgroud)

要么

const string BUILD_NUM = %BUILD_NUMBER%
Run Code Online (Sandbox Code Playgroud)

除了我不知道语法.有人可以指点我正确的方向吗?谢谢!

Egg*_*eff 19

好的,这就是我最后做的事情.它不是很优雅,但它有效.我创建了一个预构建步骤,如下所示:

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"
Run Code Online (Sandbox Code Playgroud)

然后我将"CiInfo.cs"添加到项目中,但是从版本控制中忽略了它.这样我就不必编辑或提交它,并且项目始终具有可用的常量,即最新的构建号和时间.


Mar*_*Pim 6

一种方法是在编译之前添加一个构建步骤,在%BUILD_NUMBER%的相应源文件中执行正则表达式替换.


SK-*_*gic 5

一种可能性是使用 T4 生成所有实例化的常量的配置类。T4 已很好地集成到 MSVS 中,无需您自己的自定义构建步骤。