2010-11-27 20 views
9

Dieser Stack-Überlauf Frage:Microsoft-Code Verträge ohne Visual Studio

Microsoft Code Contracts and CI build server

fragt, wie Code Verträge auf einem Build-Server arbeiten zu erhalten, ohne Visual Studio 2010 Installation Wir versuchen, das gleiche zu tun. Wir haben die in der angenommenen Antwort beschriebenen Schritte durchgeführt, konnten sie jedoch nicht ausführen.

CodeContracts wird nicht auf dem Build-Server installiert, wenn Visual Studio nicht vorhanden ist. So nach dem Vorschlag haben wir folgendes getan:

  1. Wir kopiert den Inhalt %programfiles%\Microsoft\Contracts\Bin aus einer Entwicklungsmaschine mit Visual Studio 2010 Ultimate und Code-Verträge Prämie auf den Build-Server installiert ist.
  2. Wir haben auch den Ordner MSBuild\v4.0 kopiert, der Microsoft.CodeContracts.targets und Microsoft.CodeContractAnalysis.targets enthält.

Nach der CodeContracts Dokumentation,

Mit msbuild an einem Projekt oder eine Lösung, die Verträge aktivierten über das VS-Benutzeroberfläche verwendet die gleichen Aktionen wie die entsprechende Build unter VS. ausführen

Dies ist unser Anwendungsfall, wir rufen einfach MSBuild in unserer Lösungsdatei wie folgt auf. Die Lösungsdatei wird über Visual Studio mit allen erwarteten Code Contract-Optionen erstellt, die für das Neuschreiben konfiguriert sind.

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

Aber der Rewriter wird nicht aufgerufen.

Hat jemand einen Vorschlag für das, was uns fehlt und/oder Vorschläge zur Fehlerbehebung?

Antwort

10

Ich hatte das gleiche Problem mit der neuesten Version von Code Contracts. Ich hatte die Premium Edition auf meinem Entwicklungs-PC und der Standard Edition auf dem Build-Server installiert und bekam den folgenden Fehler, weil der Rewriter nicht lief.

Muss die rewriter verwenden, wenn Contract.Requires mit <TException>

Es scheint, dass die Standard-Edition eine Schlüsseldatei fehlt (CodeContractsAfter.targets), die benötigt wird für MSBuild die Rewriter aufzurufen .

Die Lösung war für mich die CodeContractsAfter.targets von C zu kopieren: \ Program Files (x86) \ MSBuild \ 4.0 \ Microsoft.Common.targets \ ImportAfter auf meine Entwicklung PC in den entsprechenden Ordner auf der Server bauen.

Hinweis: Die Pfade waren nicht identisch, da mein Entwicklungs-PC Windows 7 64bit ausführt und der Build-Server Windows Server 2003 32bit ausführt. Sie müssen also die genauen Pfade für Ihre Umgebung herausfinden.

Wenn Sie die Premium Edition nicht verwenden, wird der Inhalt der CodeContractsAfter.targets Datei ist:

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

einfach die oben in eine Datei in dem Ordner einfügen erwähnt ImportAfter Ordner.

+0

Das hat mir geholfen, die Build-Arbeit auf einem Jenkins bauen Server zu machen, wo VS nicht installiert ist, nur MSBuild 12.0 – bvamos

3

Hier ist meine solution. Es basiert auf issue #368 und stackoverflow:Microsoft Code Contracts without Visual Studio

  1. hinzufügen DotNet.Contracts von nuget;
  2. Fügen Sie den Code unten zu Ihrer Projektdatei:
<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"/> 
Verwandte Themen