MSBuild in TeamCity der Visual Studio 2012-Lösung

72

Ich habe ein VS 2012-Webprojekt / SLN, das ich in TeamCity erstellen möchte. Es verwendet .NET 4.5, das auf TeamCity installiert ist.

Auf dem TeamCity-Server ist nur VS 2010 installiert .

Ich erhalte diese Fehlermeldung, wenn der Build ausgeführt wird:

C:\BuildAgent\work\d5bc4e1b8005d077\CUSAAdmin.Web\CUSAAdmin.Web.csproj(799, 3): 
error MSB4019: 
The imported project 
    "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. 
 Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. Project CUSAAdmin.Web\CUSAAdmin.Web.csproj failed. 
 Project CUSAAdmin.sln failed. 

Es wird versucht, Visual Studio 2012 (v11.0) zum Erstellen zu verwenden.

Ich habe das Set VisualStudioVersion sein 10 in der build.xml obwohl ??

 <Target Name="BuildPackage">
   <MSBuild Projects="CUSAAdmin.sln" ContinueOnError="false" 
     Targets="Rebuild" 
      Properties="Configuration=$(Configuration); VisualStudioVersion=10.0"  />

Auch innerhalb des Projekts wird standardmäßig VS2010 verwendet

  <PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath 
    Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
Ian Vink
quelle
Ihr vs2012-Projekt importiert eine msbuild-Zieldatei, die mit VS2012 installiert wird. Es wird nicht erstellt, es sei denn, der Build-Agent verfügt über diese neuen Ziele unter C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications \ Microsoft.WebApplication.targets
James Woolfenden
Stellen Sie einfach die Umgebungsvariable auf die Version 10.0 VS ein. Poof. Funktioniert dann.
Ian Vink

Antworten:

91

Eigentlich müssen Sie Visual Studio nicht auf Ihrem CI-Server installieren. Sie müssen nur einige Ordner von einem Entwicklungscomputer an denselben Speicherort auf dem CI-Server kopieren.

VS 2015:

  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ Web
  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ WebApplications

VS 2013:

  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ Web
  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ WebApplications

VS 2012:

  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web
  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications

VS 2010:

  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web
  • C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ WebApplications

.NET 4.6:

  • C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.6

.NET 4.5.2:

  • C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.5.2

.NET 4.5.1:

  • C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.5.1

.NET 4.5:

  • C: \ Programme (x86) \ Referenzbaugruppen \ Microsoft \ Framework \ .NETFramework \ v4.5

.NET 4.0.1:

  • C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.0.1

.NET 4.0:

  • C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.0

Sie können sie auch , wie Matt vorgeschlagen hat , in ein Unterverzeichnis Ihres Projekts kopieren und den <MSBuildExtensionsPath32>Speicherort in Ihrer MSBuild- Datei (normalerweise .csprojoder .vbproj) ändern .

Sobald Sie dies getan haben, wird Ihr Projekt kompiliert. Sie sollten die VisualStudioVersion weiterhin explizit auf die von Ihnen verwendete festlegen, um sicherzustellen, dass sie richtig eingestellt ist.

HINWEIS: Diese Lösung funktioniert für alle Projekttypen (einschließlich Webprojekte). Für eine Website (die keine Projektdatei enthält) habe ich schließlich das Windows SDK installiert, das der von mir verwendeten .NET SDK-Version entspricht, da Registrierungsschlüssel fehlten, die dazu führten, dass es nicht erstellt wurde.

NightOwl888
quelle
Ermöglicht die Lizenz für Visual Studio das Kopieren von MSBuild?
Jacob Hamacher
1
Laut stackoverflow.com/questions/3980909/… benötigen Sie keine Lizenz. Ich habe kein offizielles Dokument gefunden, das dies besagt, aber dies scheint konsequent der Rat von Microsoft-Mitarbeitern zu sein (siehe Antwort von Sayed Ibrahim Hashimi auf derselben Seite).
NightOwl888
4
Für Visual Studio 2013 ändern Sie das Verzeichnis v11.0 in v12.0
Colin Pear
Alternativ können Sie diese Dateien von NuGet herunterladen : nuget.org/packages/MSBuild.Microsoft.VisualStudio.Web.targets/… . Ich bin mir nicht ganz sicher, ob eine csproj-Änderung erforderlich ist oder ob dies automatisch erfolgt.
jpmc26
52

Es stellt sich heraus, dass es wirklich einfach ist. Damit MSBuild VS2010 als Builder für eine von VS2012 in TeamCity erstellte Lösung ausführt, legen Sie einfach die Umgebungsvariable für die Buildkonfiguration wie folgt fest:

Geben Sie hier die Bildbeschreibung ein

Name: env.VisualStudioVersion 
Value: 10.0

Hinweis In TeamCity muss VS2012 nicht installiert sein.

Ian Vink
quelle
Das ist toll! Ich hatte das gegenteilige Problem - TC war standardmäßig v10, als ich v11 verwenden musste. Verwenden env.VisualStudioVersion= 11.0gearbeitet. Vielen Dank!
Mark Carpenter
Aber es muss mindestens VS2010 auf demselben Computer wie der Teamcity-Server installiert sein, oder?
Maxim V. Pavlov
Nein, das tut es nicht. VS2012 ist abwärtskompatibel mit VS2010 proj und sln.s
Ian Vink
3
Hat jemand eine Ahnung, warum Teamcity versucht, C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 zu verwenden, wenn ich es nicht einmal installiert habe?
Geovani Martinez
7

Alternativ können Sie die benötigten Build-Ziele aus c: \ Programme (x86) \ MSBuild in ein Unterverzeichnis Ihres Projekts (z. B. \ Build) kopieren, um sicherzustellen, dass die Struktur erhalten bleibt, und Folgendes zu Ihrem csproj hinzufügen:

<!-- redirect msbuild path so targets can be added to source control -->
<PropertyGroup>
  <MSBuildExtensionsPath32>..\Build\</MSBuildExtensionsPath32>
</PropertyGroup>

Wenn mein Projektstamm beispielsweise C: \ Dev \ MyProjSln \ MyProj ist

  • Erstellen Sie den Ordner C: \ Dev \ MyProjSln \ Build \ Microsoft \ VisualStudio \ version \ WebApplications \
  • Kopieren Sie den Inhalt von C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ version> \ WebApplications \ in den erstellten Ordner
  • Fügen Sie das MSBuildExtensionsPath32-Element zur Eigenschaftsgruppe unter dem Projektknoten in csproj hinzu
  • Profitieren!

Persönlich bevorzuge ich diese Methode zum Verfolgen von Abhängigkeiten von Build-Zielen, da sie verhindert, dass Build-Server von undokumentierten Anforderungen an die Ordnerstruktur abhängig sind, und Ihre Abhängigkeiten in die Quellcodeverwaltung einbindet

Matt
quelle
3
Dies ist der richtige Weg und funktioniert für mich. Verhindert auch das Problem "Es baut auf meiner Workstation auf".
Jslatts
Um dies zu verhindern, denke ich, dass dies meiner Meinung nach ein besserer Weg ist und die Microsoft.Net.Compilers-Version installiert. Damit erhalten Sie die gleiche Struktur des MSBuild-Ordners wie eine Nuget-Abhängigkeit, und es besteht keine Notwendigkeit, die zu ändern csproj. Die schlechte Seite davon ist meiner Meinung nach, dass Sie für jedes Projekt in Ihrer Lösung, das von derselben Version Ihres MSBuild abhängt, dasselbe denken müssen, aber in Ihrem Fall dasselbe. Was denkst du @Matt?
Zinov
6

Wie hier beschrieben :

  • Installieren Sie das Nuget MSBuild.Microsoft.VisualStudio.Web.targets
  • Bearbeiten Sie die .csproj-Datei

Ersetzen:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> 
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

mit:

<Import Project="..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" Condition="true" />

Natürlich müssen Sie sicherstellen, dass die Versionen sowohl auf dem installierten Nuget als auch auf dem Pfad in Ihrem Fall übereinstimmen <Import>

Thomas Eyde
quelle
4

Ich bin völlig anderer Meinung als das Ändern der Projektdateien, da dies andere Entwickler betreffen könnte. Dies hat bei mir funktioniert, da der Ordner v11.0 im MS-Build-Ordner fehlte: 1) Erstellen Sie v111.

  1. Erstellen Sie den Ordner v11.0 unter C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio
  2. Kopieren Sie Web- und WebApplications-Ordner aus meinem Entwicklungsfeld "C: \ Programme (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0".
  3. Booom! arbeite wie ein Zauber \
  4. Hinweis: Ich habe "Microsoft Visual Studio 2012 Shell (isoliert) weiterverteilbares Paket" installiert.
NoloMokgosi
quelle
1
wirklich schöne Arbeit Schritt 4 war der super nützliche für mich. Verwenden Sie für v12.0 Microsoft Visual Studio 2013 Shell (isoliert) Redistributable Package
P6345uk
-1

Erstens erfordert TeamCity nicht das Vorhandensein von Visual Studio einer Version zum Erstellen. Wenn ein Build-Schritt im Projekt mit MSBuild Runner konfiguriert wird, muss TeamCity wissen, welche Version von MSBuild verwendet werden soll. Dies ist eine Einstellung eines Erstellungsschritts. Die richtige MSBuild-Version muss in einer Build-Schritt-Konfiguration gemäß den auf einem Build-Computer installierten .NET-Tools ausgewählt werden. TeamCity verwendet diesen Wert, um den Standortpfad zu bestimmen, und legt beim Aufrufen von MSBuild eine Umgebungsvariable fest.

Das Problem mit Visual Studio 2012/2013 ist, dass es nur von TeamCity ab 8.1.0 unterstützt wird. Wenn Ihre TeamCity-Version also vor 8.1 liegt. Sie müssen auf die neueste Version 8.1.x aktualisieren, um eine Einstellung für MSBuild Tools 2013 anzuzeigen. Sobald Sie in den Einstellungen für den Erstellungsschritt eine geeignete MSBuild-Version ausgewählt haben, verschwindet das Problem. Weitere Informationen finden Sie hier: http://blog.turlov.com/2014/07/upgrade-teamcity-to-enable-support-for.html

Alex T.
quelle