没有Visual Studio的Microsoft代码合同

时间:2010-11-27 10:53:51

标签: visual-studio-2010 msbuild teamcity code-contracts

这个堆栈溢出问题:

Microsoft Code Contracts and CI build server

询问如何在不安装Visual Studio 2010的情况下在构建服务器上运行代码协议。我们正在尝试执行相同的操作。我们已经按照接受的答案中列出的步骤进行了操作,但未能使其正常工作。

除非存在Visual Studio,否则CodeContracts不会安装在构建服务器上。所以按照这个建议,我们已经完成了以下工作:

  1. 我们将安装了Visual Studio 2010 Ultimate和Code Contracts Premium的开发计算机中的%programfiles%\Microsoft\Contracts\Bin内容复制到构建服务器。
  2. 我们还复制了包含MSBuild\v4.0Microsoft.CodeContracts.targets的{​​{1}}文件夹。
  3. 根据CodeContracts文档,

      

    在使用通过VS用户界面启用的合同的项目或解决方案上使用msbuild将执行与VS下相应构建相同的操作。

    这是我们的用例,我们只是在我们的解决方案文件中调用MSBuild,如下所示。解决方案文件是通过Visual Studio创建的,其中所有预期的代码协定选项都配置为重写。

    Microsoft.CodeContractAnalysis.targets

    但重写者没有被召唤。

    是否有人建议我们缺少什么和/或建议的问题排查步骤?

2 个答案:

答案 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 #368stackoverflow:Microsoft Code Contracts without Visual Studio

  1. 从nuget添加DotNet.Contracts;
  2. 将以下代码添加到您的项目文件中:
  3. <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"/>