我已经开始在我正在编写的所有新代码中使用Code Contracts,例如在我正在构建的框架库中,以帮助引导IoC,O/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文件如何进行正确的代码缩写重写?
答案 0 :(得分:1)
答案在剧本中。所有Visual Studio将要做的是运行将调用其他人的MSBuild任务。您可以做的一件事是转到工具|选项|构建...并打开日志记录,这样您就可以详细查看哪些位正在做什么来生成工件。
如何处理如此复杂且涉及的事情?阅读a guide to MSBuild,例如Hashimi p1和Part 2。
然后深入研究构建的来源,例如:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets
到达那里的最好方法是打开你的.csproj并查看它包含的内容并通过它(.CSharp.targets是第一个 - 我引用的那个在堆栈的下方)。
(等等有人带着真正的答案进入!)
答案 1 :(得分:1)
我在Code Contract的静态分析中玩了一点,非常酷 现在尝试设置TeamCity构建......
以下是Microsoft Research的{{3}}信息(请参阅第44页)