在使用MSBuild构建的库代码中使用代码约定

时间:2010-08-24 07:45:59

标签: msbuild code-contracts ccrewrite

我已经开始在我正在编写的所有新代码中使用Code Contracts,例如在我正在构建的框架库中,以帮助引导IoCO/RM等,在ASP.NET MVC应用程序中。我为这个框架库编写了一个简单的构建脚本,如下所示:

@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未完全重写的程序集{1}}丢弃输出目录的文件。

首先在Visual Studio 2010中构建解决方案的工作是什么,在批处理文件中注释掉第3行到第7行并再次运行它。然后,我最终得到了正确的重写程序集,没有.pdb.original.rewritten个文件。

我从中推断出Visual Studio 2010以某种方式正确触发了Code Contract重写器,因此Visual Studio 2010构建的结果程序集被命令行MSBuild调用重用,所以我的批处理脚本基本上是什么只是将文件复制到build目录。换句话说,相当无用。

我读过this,但Jon的问题似乎与我的不同,因为ccrewrite显然正在做某事,但它只是因为某种原因没有完成重写。 Integration.build文件构建了正确的配置(在.csproj文件中启用了代码约定),其他一切看起来都正确,它只是无法正常工作。

所以,我想知道:我如何运行MSBuild,就像Visual Studio 2010在ccrewrite完成预期的那样运行,并且不会丢弃我的输出目录.rewritten和{{1文件?有没有人有一个完美的例子,说明MSBuild文件如何进行正确的代码缩写重写?

2 个答案:

答案 0 :(得分:1)

答案在剧本中。所有Visual Studio将要做的是运行将调用其他人的MSBuild任务。您可以做的一件事是转到工具|选项|构建...并打开日志记录,这样您就可以详细查看哪些位正在做什么来生成工件。

如何处理如此复杂且涉及的事情?阅读a guide to MSBuild,例如Hashimi p1Part 2

然后深入研究构建的来源,例如:

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

到达那里的最好方法是打开你的.csproj并查看它包含的内容并通过它(.CSharp.targets是第一个 - 我引用的那个在堆栈的下方)。

(等等有人带着真正的答案进入!)

答案 1 :(得分:1)

我在Code Contract的静态分析中玩了一点,非常酷 现在尝试设置TeamCity构建......

以下是Microsoft Research的{​​{3}}信息(请参阅第44页)