22

Hudsonを使用してプロジェクトを構築し、Hudsonはコンパイル時に「%BUILD_NUMBER%」などの環境変数を便利に定義します。

その変数をコードで使用したいので、実行時にこれがどのビルドであるかをログに記録するなどのことができます。ただし、System.Environment.GetEnvironmentVariableはランタイム環境にアクセスしているため、実行できません。必要なのは次のようなものです。

#define BUILD_NUM = %BUILD_NUMBER%

また

const string BUILD_NUM = %BUILD_NUMBER%

構文がわからないことを除いて。誰かが私を正しい方向に向けてくれませんか?ありがとう!

4

5 に答える 5

21

さて、ここで私がやったことです。あまりエレガントではありませんが、機能します。次のようなビルド前のステップを作成しました。

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」をプロジェクトに追加しましたが、バージョン管理から無視しました。そうすれば、編集したりコミットしたりする必要がなくなり、プロジェクトには常に最新のビルド番号と時間である定数が利用可能になります。

于 2010-12-15T18:02:11.013 に答える
7

これを行う 1 つの方法は、ビルドステップをコンパイル前に追加して、%BUILD_NUMBER% の適切なソース ファイルで正規表現置換を行うことです。

于 2010-12-15T13:15:18.773 に答える
5

1 つの可能性は、T4 を使用して、すべての定数がインスタンス化された構成クラスを生成することです。T4 は MSVS に適切に統合されているため、独自のカスタム ビルド ステップは必要ありません。

于 2010-12-15T13:22:38.330 に答える
1

define では、C/C++ のように C# で内容を定義することはできません。

このページから:

#define ディレクティブは、通常 C および C++ で行われているように、定数値を宣言するために使用することはできません。C# の定数は、クラスまたは構造体の静的メンバーとして定義するのが最適です。このような定数が複数ある場合は、それらを保持する別の「定数」クラスを作成することを検討してください。

AssemblyInfo クラスにビルド番号を反映させたい場合、ほとんどのビルド ツールはビルド時にそのクラスを生成することをサポートしています。MSBuild にはそのためのタスクがあります。 NAnt もそうです。ハドソンがこれをどのように行うかはわかりません。

于 2010-12-15T13:20:19.567 に答える