2010-11-27 19 views
9

Esta pregunta desbordamiento de pila:Microsoft Visual Studio código sin

Microsoft Code Contracts and CI build server

se pregunta cómo conseguir contratos de trabajo de código en un servidor de compilación sin necesidad de instalar Visual Studio 2010. Estamos tratando de hacer lo mismo. Hemos seguido los pasos descritos en la respuesta aceptada, pero no hemos podido hacerlo funcionar.

CodeContracts no se instalará en el servidor de compilación a menos que Visual Studio esté presente. Así pues, siguiendo la sugerencia, hemos hecho lo siguiente:

  1. copiamos el contenido de %programfiles%\Microsoft\Contracts\Bin de una máquina de desarrollo con Visual Studio 2010 Ultimate y Código de Contratos instalado en el servidor de compilación Premium.
  2. También copiamos la carpeta MSBuild\v4.0 que contiene Microsoft.CodeContracts.targets y Microsoft.CodeContractAnalysis.targets.

De acuerdo con la documentación CodeContracts,

Usando msbuild en un proyecto o solución que utiliza contratos habilitados a través de la interfaz de usuario VS llevará a cabo las mismas acciones que la acumulación correspondiente en VS.

Este es nuestro caso de uso, simplemente estamos llamando a MSBuild en nuestro archivo de solución de la siguiente manera. El archivo de solución se crea a través de Visual Studio con todas las opciones de Contrato de código esperadas configuradas para la reescritura.

<Target Name="Release"> 
    <MSBuild Projects = "Cofamilies\WebApplication\CofamiliesWeb.sln" Properties="Configuration=Release" /> 
</Target> 

Pero no se está llamando a la reescritura.

¿Alguien tiene alguna sugerencia sobre lo que nos falta y/o pasos sugeridos para la solución de problemas?

Respuesta

10

Tuve el mismo problema con la última versión de Code Contracts. Había instalado la Edición Premium en mi PC de desarrollo y la Edición estándar en el servidor de compilación y recibía el siguiente error debido a que la Reescritura no se estaba ejecutando.

debe utilizar la re-escritura al utilizar Contract.Requires <TException>

Parece que la edición estándar no se encuentra un archivo de clave (CodeContractsAfter.targets) que se necesita para MSBuild para invocar la Regrabadora .

La solución para mí fue copiar los CodeContractsAfter.targets de C: \ Archivos de programa (x86) \ MSBuild \ 4.0 \ Microsoft.Common.Targets \ ImportAfter en mi PC de desarrollo a la carpeta correspondiente en el servidor de compilación

Nota: Las rutas no eran idénticas ya que mi PC de desarrollo ejecuta Windows 7 64bit y el servidor de compilación ejecuta Windows Server 2003 de 32 bits. Por lo tanto, deberá averiguar las rutas exactas para su entorno.

Si no está utilizando la edición Premium, el contenido de la CodeContractsAfter.targets archivo es:

<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> 

basta con pegar el anterior en un archivo en la carpeta mencionado ImportAfter carpeta.

+0

Esto me ayudó a hacer el trabajo de construcción en el servidor Jenkins construir donde VS no está instalado, sólo el 12,0 MSBuild – bvamos

3

Aquí está mi solution. Se basa en issue #368 y stackoverflow:Microsoft Code Contracts without Visual Studio

  1. Añadir DotNet.Contracts de Nuget;
  2. Añadir código de abajo para su archivo de proyecto:
<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"/> 
Cuestiones relacionadas