这个堆栈溢出问题:
Microsoft Code Contracts and CI build server
询问如何在不安装Visual Studio 2010的情况下在构建服务器上运行代码协议。我们正在尝试执行相同的操作。我们已经按照接受的答案中列出的步骤进行了操作,但未能使其正常工作。
除非存在Visual Studio,否则CodeContracts不会安装在构建服务器上。所以按照这个建议,我们已经完成了以下工作:
%programfiles%\Microsoft\Contracts\Bin
内容复制到构建服务器。MSBuild\v4.0
和Microsoft.CodeContracts.targets
的{{1}}文件夹。根据CodeContracts文档,
在使用通过VS用户界面启用的合同的项目或解决方案上使用msbuild将执行与VS下相应构建相同的操作。
这是我们的用例,我们只是在我们的解决方案文件中调用MSBuild,如下所示。解决方案文件是通过Visual Studio创建的,其中所有预期的代码协定选项都配置为重写。
Microsoft.CodeContractAnalysis.targets
但重写者没有被召唤。
是否有人建议我们缺少什么和/或建议的问题排查步骤?
答案 0 :(得分:10)
我对最新版本的Code Contracts有同样的问题。我在构建服务器上的开发PC和Standard Edition上安装了Premium Edition,并且由于重写器未运行而出现以下错误。
使用时必须使用重写器 Contract.Requires< TException>
标准版似乎缺少MSBuild调用重写器所需的密钥文件(CodeContractsAfter.targets)。
我的解决方案是从 C:\ Program Files(x86)\ MSBuild \ 4.0 \ Microsoft.Common.Targets \ ImportAfter 复制 CodeContractsAfter.targets 我的开发PC到构建服务器上的相应文件夹。
注意:路径不相同,因为我的开发PC运行的是Windows 7 64位,而构建服务器运行的是Windows Server 2003 32位。因此,您需要确定适合您环境的路径。
如果您没有使用Premium Edition, CodeContractsAfter.targets 文件的内容为:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Begin CodeTools: CodeContracts: After -->
<PropertyGroup>
<CodeContractsInstallDir Condition="'$(CodeContractsInstallDir)'==''">C:\Program Files (x86)\Microsoft\Contracts\</CodeContractsInstallDir>
</PropertyGroup>
<Import Condition="'$(CodeContractsImported)' != 'true' AND '$(DontImportCodeContracts)' != 'true'" Project="$(CodeContractsInstallDir)MsBuild\v4.0\Microsoft.CodeContracts.targets" />
<!-- End CodeTools: CodeContracts: After -->
</Project>
只需将上述内容粘贴到 ImportAfter 文件夹中的文件中。
答案 1 :(得分:3)
这是我的solution。 它基于issue #368和stackoverflow:Microsoft Code Contracts without Visual Studio
<PropertyGroup>
<CodeContractsInstallDir Condition="'$(CodeContractsInstallDir)' == ''">$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\packages\DotNet.Contracts.1.10.20606.1\'))</CodeContractsInstallDir>`
</PropertyGroup>
<Import Condition="'$(CodeContractsImported)' != 'true' AND '$(DontImportCodeContracts)' != 'true'" Project="$(CodeContractsInstallDir)\MsBuild\v$(VisualStudioVersion)\Microsoft.CodeContracts.targets"/>