2010-12-15 76 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中,不需要您自己的定制构建步骤。

相关问题