Могу ли я сделать константу из переменной env компиляции в csharp?

Мы используем Hudson для создания наших проектов, и Хадсон удобно определяет переменные среды, такие как "% BUILD_NUMBER%" во время компиляции.

Я хотел бы использовать эту переменную в коде, поэтому мы можем делать что-то вроде log what build this во время выполнения. Однако я НЕ МОГУ выполнить System.Environment.GetEnvironmentVariable, потому что это доступ к среде выполнения, я хочу что-то вроде:

#define BUILD_NUM = %BUILD_NUMBER%

или

const string BUILD_NUM = %BUILD_NUMBER%

Кроме того, я не знаю синтаксиса. Может ли кто-нибудь указать мне в правильном направлении? Спасибо!

Ответ 1

Хорошо, вот что я сделал. Он не очень изящный, но он работает. Я создал шаг предварительной сборки, который выглядит так:

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", но проигнорировал его из управления версиями. Таким образом, мне никогда не придется его редактировать или комментировать, а проект всегда имеет постоянную доступность, это последний номер сборки и время.

Ответ 2

Один из способов сделать это - добавить этап сборки перед компиляцией, которая заменяет регулярное выражение в соответствующих исходных файлах для% BUILD_NUMBER%.

Ответ 3

define не позволяет вам определять константы в С#, как вы можете в C/С++.

От эта страница:

Директива #define не может использоваться для объявления постоянных значений, как это обычно делается на C и С++. Константы в С# лучше всего определяются как статические члены класса или структуры. Если у вас есть несколько таких констант, подумайте о создании отдельного класса "Константы" для их хранения.

Если вы хотите отразить номер сборки в классе AssemblyInfo, большинство инструментов сборки поддерживают создание этого класса во время сборки. У MSBuild есть задача для него. Как и NAnt. Не знаете, как это делает Хадсон.

Ответ 4

Одна из возможностей - использовать T4 для генерации вашего класса конфигурации со всеми созданными константами. T4 хорошо интегрирован в MSVS, нет необходимости в создании собственного пользовательского шага сборки.