2011-10-30 8 views
0

私はTeamCityを使用して.NET製品をビルドしています。参照アセンブリのコピーを避け、単体テストを実行する方法

解決策のすべての出力を1つのフォルダの下に集めたいと思います。

そうするために、CopyLocalをすべてのプロジェクトに対してfalseに設定したいので、* / .dllをコピーすると、冗長ファイルはコピーされません。

大きな.slnファイルがプロジェクトにあります。そのほとんどはAPIアセンブリを参照しており、一部はソリューションの他のプロジェクトを参照しています。

これはデバッグでは問題ありませんが、プロジェクトの出力のみを取り込み、ビルドが成功した後にそのフォルダに参照ファイルをコピーすることなく、それをいくつかのフォルダにコピーすることができます。

同時に、参照ファイルがコピーされなくなると、実行中の単体テストはビルドサーバー上で動作しません。その一部は参照アセンブリが必要なためです。

おそらくビルドを2回実行することなく、この問題を解決するために頭を抱えているようではありません(テストを実行するためのもの、コピー元の「クリーン」なフォルダを実際に取得するためのもの)。

このようなビルドを管理するための提案はありますか?

+3

コピーしたくない「冗長なファイル」とは何ですか?彼らは全く冗長でないように思えます。私はCopyLocal = trueを使用して、それをそのように動作させることをお勧めします... –

+3

デバッギングとユニットテストを行うには参照アセンブリをコピーすることが不可欠です。 CLRは、アセンブリの選択されたいくつかの場所のみを調べます。これはDLL Hellの対策です。無効にしないでください。または、AppDomain.AssemblyResolveのイベントハンドラを実装して、独自のDLL Hellを作成します。 –

+0

@jonskeet私は自分の質問を更新しました。これらのファイルは、プロジェクトの出力として保存するという観点からは冗長です。それらは各プロジェクトの成果の一部として必要ではないので、私はそれらを含めたくありません。 –

答えて

1

実際にビルドを実行するために実際に使用しているものがわかりません。 msbuildやnantのようなビルドスクリプトを使用していますか?組み込みのTeamCityビルドステップを使用していますか?

あなたは、あなたが以下のものを使用して、すべてのコンパイル済みのアセンブリのパスを取得することができますMSBuildのを使用している場合:

<MSBuild Projects="@(Solutions)" Targets="Rebuild"> 
    <Output ItemName="Outputs" TaskParameter="TargetOutputs"/> 
</MSBuild>  

出力は今、各アセンブリへの完全なパスが含まれています。つまり、これらのファイルをストレージの別の場所にコピーするための追加ステップを追加することができます。ユニットテストを実行した後、不要なファイル(クリーンなど)をすべて削除することができます。

<CreateItem Include="$(BuildOutputDir)\**\*.*" Exclude="@(Outputs)"> 
    <Output TaskParameter="Include" ItemName="FilesToClean"/> 
</CreateItem> 

<Delete Files="@(FilesToClean)" /> 
私は私のdevのマシンではないんだが、それが役に立てば幸いとして

私は上記をテストすることはできません

+0

今はMSBuildの組み込みランナーを使用しています。これに.slnファイルを指定しています。私はこのオプションについて考えました。これは、MSBuildにビルドスクリプトを書き込むことを意味しています(何時でもやりたかったことです)。ありがとう、これは動作するはずです:) –

関連する問題