3

ASP.NET MVC アプリケーションでIoCO/RMなどをブートストラップするために構築しているフレームワーク ライブラリなど、作成中のすべての新しいコードでCode Contractsの使用を開始しました。このフレームワーク ライブラリ用に、次のような簡単なビルド スクリプトを作成しました。

@echo off
echo.
echo Cleaning build output (removing 'obj' and 'bin' folders)...
for /f "tokens=*" %%G in ('dir /b /ad /s bin') do rmdir /s /q "%%G"
for /f "tokens=*" %%G in ('dir /b /ad /s obj') do rmdir /s /q "%%G"
rmdir /s /q build
echo.
echo Starting the build...
call "%VS100COMNTOOLS%\vsvars32.bat"
msbuild Integration.build /target:Build
echo.
echo Done!
pause

これはうまくいきません。buildこれを実行すると、何らかの理由でフォルダーに最終的に残るのは、とも呼ばれる によって完全に書き換えられていないアセンブリと、出力ディレクトリに散らばるファイルですccrewrite.pdb.original.rewritten.csproj.FileListAbsolute.txt

機能するのは、最初に Visual Studio 2010 でソリューションを構築し、バッチ ファイルの 3 行目から 7 行目をコメント アウトして、再度実行することです。その後、適切に書き換えられたアセンブリが作成され、ファイル.pdb.original.rewrittenファイルもありません。

このことから私が推測したのは、Visual Studio 2010 がコード コントラクト リライターを何らかの方法で適切にトリガーするため、Visual Studio 2010 ビルドから得られたアセンブリがコマンド ライン MSBuild 呼び出しによって再利用されるため、バッチ スクリプトが基本的に行うことはファイルをbuildディレクトリにコピーしています。むしろ役に立たない、言い換えれば。

私はこれを読みましccrewriteが、ジョンの問題は明らかに何かをしているので、私の問題とは異なるようですが、何らかの理由で書き直しが完了していません。Integration.buildファイルは正しい構成 (ファイルでコード コントラクトが有効になっている) を構築し、他.csprojのすべては正しく見えますが、正しく動作しません。

だから、私は疑問に思っています: Visual Studio 2010 の方法で MSBuild を実行するにはどうすればよいですccrewriteか? 適切なコード コントラクトの書き換えを行う MSBuild ファイルがどのように見えるかを示す完璧な例はありますか?.rewritten.pdb.original

4

2 に答える 2

1

Code Contract の静的解析を少し試してみましたが、これはかなりクールです。
現在、TeamCity ビルドをセットアップしようとしています...

Microsoft Research からのmsbuild 統合情報は次のとおりです(44 ページを参照)。

于 2010-08-27T15:56:26.887 に答える
1

答えはスクリプトにあります。Visual Studio が行うことは、他のタスクを呼び出す MSBuild タスクを実行することだけです。できることの 1 つは、Tools|Options|Build... に移動してログを有効にすることです。これにより、アーティファクトを生成するためにどのビットが何を行っているかを詳細に確認できます。

このような複雑で複雑なことをどのように行うのでしょうか? Hashimi p1Part 2などのMSBuild のガイドをお読みください。

次に、ビルドのソースを掘り下げます。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets

そこにたどり着く最良の方法は、.csproj を開いて、そこに含まれているものを調べ、それを経由することです (.CSharp.targets が最初のものです。私が引用したものは、スタックのさらに下にあります)。

(それで、誰かが実際の答えを出すのを待ちます!)

于 2010-08-24T08:02:33.833 に答える