Могу ли я сделать константу из переменной env времени компиляции в csharp? - PullRequest
16 голосов
/ 15 декабря 2010

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

Я бы хотел использовать эту переменную в коде, чтобы мы могли делать такие вещи, как протоколирование сборки во время выполнения. Однако я не могу сделать System.Environment.GetEnvironmentVariable, потому что это доступ к среде выполнения, что я хочу, это что-то вроде:

#define BUILD_NUM = %BUILD_NUMBER%

или

const string BUILD_NUM = %BUILD_NUMBER%

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

Ответы [ 4 ]

18 голосов
/ 15 декабря 2010

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

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

6 голосов
/ 15 декабря 2010

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

1 голос
/ 15 декабря 2010

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

1 голос
/ 15 декабря 2010

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

С этой страницы :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...