MSBuild— .csprojファイルを使用するか、独自にロールしますか?
-
03-07-2019 - |
質問
OK、それで私は継続的な統合に関しては初心者だとすぐに認めます。
とはいえ、私は自分自身を教育するためにCC.NET環境をセットアップしようとしていますが、自動ビルド部分をセットアップするために必要な情報を見つけるのに苦労しています。
私が理解しているように、C#では、VS 2005以降で生成された.csprojファイルは有効なMSBuildファイルです。 つまり、.csprojファイルを使用してMSBuildタスクをCC.NETに統合できましたが、これにはいくつかの問題があります。
- ここでは、自動化されたビルド環境で本当に必要かどうかわからないことがたくさんあります。
- このファイルは作成しませんでした。私はそれを理解していません、そしてそれは私を怖がらせます。 (一致によるプログラミング)
- 行われていることの大部分は、
$(MSBuildToolsPath)\ Microsoft.CSharp.targets
によって抽象化されているようです。
- 1、2、および3の結果、MbUnitのようなものを含むようにファイルを変更すると、複雑になり、必要以上に困難になります。私の唯一の本当のオプションは、
AfterBuild
セクションに含めることです。これは、私にとっては一種のハックのようです。
では、CC.NETの人々、MSBuildの人々、MbUnitの人々にいくつか質問をします。
- MSBuildを使用する場合、VSで生成された.csprojファイルをビルドファイルとして使用することをお勧めしますか?または、自分で作成する必要がありますか?
- MbUnitテストはMSBuildファイルまたはCC.NETファイルの一部ですか?私の調査では、それらがMSBuildファイルに属していることを示唆しているようです。その場合、新しいMSBuild .projファイルを作成し、.csprojファイルに加えてCVSにチェックインしますか?または、MbUnitタスクは.csprojファイルの一部になりますか?
- 質問2に似ています。MSBuildファイルにMbUnitテストを追加し、最終的に.csprojファイルを使用すると、
Target Name =" AfterBuild"
が実際にその情報を追加するセクションになります?Target Name =" Test"
セクションはありませんか? VSで生成された.csprojファイルを使用すると、2番目のオプションが妨げられるようです。
そこにたくさんあることは知っていますが、オンラインで見つけることができるもののほとんどは、私がちょうど持っていないこれらのトピックにある程度の親しみを持っていることを前提としています-間違っていない限り、このようなものはまったく曲線ではなく、ステップ関数です。 :)
編集1:テキストをより簡潔にするために、また回答に関して残されたいくつかの質問に対処するために更新しました。
解決
生成された.csprojファイルを使用することをお勧めします。実際、実稼働環境では、生成された.slnファイルを使用することをお勧めします。開発者と同じソリューションファイルを使用することで、あなたが得られることがわかりました。
.slnファイルは実際には有効なmsbuildプロジェクトファイルではないことに注意してください。入力として使用されると、msbuild自体によってmsbuildプロジェクトに変換されます。トリッキー!
学習目的で、.csprojのビルドをログに記録し、何が起こっているのかを把握するためにステップスルーすることができます。 MSBuildはnantよりも宣言的であるため、時間をかけて少し実験してください。
最後に、.slnまたは.csprojファイルをmsbuildタスクで連続ビルドスクリプトプロジェクトにラップして、プロジェクトをビルドし、ユニットテストを一緒に実行します。このように、開発者はビルドするたびに単体テストを実行する必要はありませんが、コードを統合するたびに単体テストが実行されます。そして、はい、それらが速く動くことを確かめてください!代わりに、スケジュールされた(夜間?)ビルド中に1秒以上かかるものを実行する必要があります。 1秒以上かかる場合は、ユニットテストが少なく、ユニットテストフレームワークで記述された統合テストが多いようです。
編集:役に立つとわかった追加情報-MSBuild 3.5を使用すると、.slnファイルからターゲット出力を取得できますが、この情報はMSBuild 2.0では返されません(両方のバージョンの.csprojファイルで動作するはずだと思いますが)。出力(ビルドファイル)を単体テストフレームワークへの入力として使用できます。
他のヒント
csprojファイルをそのまま残します(あなたが言うように、あなたはそれを理解していません)。
独自のmsbuild projファイルを作成し、msbuildタスクを介してメインビルドファイルからcsproj(またはsln)を呼び出します。 CIサーバーにビルドファイルをビルドするよう指示します。
この分離により、独自の事前タスクと事後タスク(ユニットテスト、SQLスクリプトのスモークテスト、fxcop /その他の静的分析など)を簡単に追加でき、作業環境を壊すことはありません。また、希望するもの(msbuild / antなど)でカスタムターゲットを実行できることも意味します。コードプレックスでMSBuildContribを使用すると、さらに優れた機能が得られます。
ビルドサーバーに視覚的なstuidoは必要ありません(展開プロジェクトがある場合を除き、前回見たときから変更されていない限り)
独自のプロジェクトファイルを作成し(* projで終わるものはすべてMSBuildによってプロジェクトファイルと見なされます)、そこからビルドを呼び出します。このように:
<MSBuild Projects="MySolution.sln" Targets="Clean; Rebuild" Properties="Configuration=$(BuildMode);">
msbuildは、変更せずに.sln(ソリューションファイル)をビルドすることもできます。これは通常、多数のcsprojファイルを用意するよりも簡単です...
NAntとMSBuildの両方を使用します。 NAntは NAntContrib でアップグレードされたため、 msbuild taks。一時的なセットアップの場合もありますが、これまでのところ大きな問題は発生していません。 VS2008で使用しているのと同じcsproj / slnを使用しているため、新しいcsprojファイルも作成しません。 msbuildを使用してプロジェクトを構築すると、従来のNAntスクリプトが大幅に簡素化されました( csc タスク)。
注:
- Windowsワークフローを使用する場合 あなたのプロジェクトの基礎 このようなビルドに大きな困難があります msbuildのないプロジェクト。
- ビルドマシンにVS.NETをインストールしないでください。 Wix を使用してインストールmsiを作成できます。
- @Franci Penov:ユニットテストの実行は、すべてのビルドの一部である必要があります。本当に明日までバグを見つけるのを待ちたいですか?サイドノートがあります:ユニットテストは非常に高速に実行される必要があります。
個人的には、.csprojファイルを使用しても問題ないと思います。独自のMSBuildプロジェクトを展開する場合、自分で追加する必要がないほど多くは行われていません。
ただし、どのようなルートを選択したとしても、ビルドステップの一部としてMbUnitを追加するのではなく、CC.Netの別のステップとして追加することをお勧めします。単体テストの実行は、毎日のCIサイクルの一部である必要があります。ただし、すべてのビルドの一部ではありません。
OK、注意すべき点はいくつかあります。 csproj形式はVS2005からVS2008に変更されました。また、MSBuildを使用する場合は、.vdproj(セットアップ)ファイルをビルドできないことに注意してください。そのためには、devenv(VS実行可能ファイル)が必要です。つまり、devenvを呼び出して自動的にビルドするMSBuildタスクをいつでも作成できます。
独自のcsprojファイルを構築するか、VS2005によって作成されたファイルを使用するかという質問については、中道をお勧めします。独自のプロジェクトテンプレートを作成します。これにより、ニーズに対応し、VSが残りを処理します。
msbuildの入力として.csprojを使用しても構いません。 VSからのコンパイル中に無視されるタスクをcsprojに手動で追加できます。ただし、些細でないものを作成する場合は、msbuildのスクリプトを個別に作成することをお勧めします。また、csprojファイルから参照できます。 TFSの一部であるMS Build Serverをご覧になりましたか? TFSのSourceControlと統合され、CIに使用できます。そのプロジェクトファイルはmsbuildスクリプトです。
nAntを使用した場合、VSをサーバーにインストールする必要がありますか? 「MSBuild」という意味ですか?いいえ、csbuildをcsprojファイルと共に使用するためにVSをインストールする必要はありません。