Ich habe die folgende Konfiguration: ASP.Net MVC .Net 4.0-Lösung mit 5 Projekten und mehrere Lösungskonfigurationen (Site1-Bühne, Site1-Live, Site2-Bühne, etc). Der Grund dafür ist einfach: Wir stellen dieselbe Codebasis auf mehreren Servern mit unterschiedlichen Konfigurationseinstellungen bereit.MSBuild - Wie erzwinge ich "AfterBuild" Ziel, wenn ich die Bereitstellung mache?
Um diese Konfigurationen zu verwalten, verwende ich den von Troy Hunt in seinem Artikel You're deploying it wrong! TeamCity, Subversion & Web Deploy part 1: Config transforms beschriebenen Ansatz. In 2 Worte - ich habe nicht web.config in meinem SVN Repo, anstatt habe ich Web.Base.Config, Web.Site1-Stage.Config, etc und XmlTransformation Aufgabe in Projekt Afterbuild Ziel. Beim Build wird die erforderliche web.config auf ausgewählte Konfiguration erzeugt basiert:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
<TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" StackTrace="true" />
</Target>
Hier kommt das Problem: wenn ich ausführen MSBuild wie folgt aus:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild
geht alles Nun, web.config wird ordnungsgemäß für die Site1-Stage Konfiguration generiert. Allerdings, wenn ich diesen Befehl:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild /P:DeployOnBuild=True
ich die folgende Fehlermeldung erhalten:
"MySolution.sln" (rebuild target) (1) -> "MySolution\MyWebProj.csproj" (Rebuild target) (3) -> (PreTransformWebConfig target) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Microsoft.Web.Publishing.targets(1399,5): error : Copying file Web.config to obj\Site1-Stage\TransformWebConfig\original\Web.config failed. Could not find file 'Web.config'. [MySolution\MyWebProj.csproj]
Ich habe versucht, explizit "Afterbuild" target in MSBuild-Befehlszeile hinzufügen:
msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild,AfterBuild /P:DeployOnBuild=True
aber es ergab sich der gleiche Fehler.
Warum brauche ich das: es ist ein sehr isoliertes Beispiel, und in Wirklichkeit versuche ich automatisierte Veröffentlichung von TeamCity CI-Server einzurichten. Ich denke, wenn ich einen neuen Build-Schritt mit "Visual Studio (sln)" Läufer vor meinem aktuellen Veröffentlichungsschritt hinzufügen würde, würde es zuerst das Projekt neu erstellen (und web.config generieren) - und dann veröffentlichen. Allerdings habe ich viele Publishing-Schritte (etwa 20 jetzt) und ich möchte das vermeiden. Mein Verständnis ist, dass "Veröffentlichen" -Prozess den Build als Teil davon macht, also möchte ich das "wiederverwenden".
Frage ist: Wie soll ich meine MSBuild-Befehlszeile ändern, um die Konfiguration zu erzwingen?
Vielen Dank.
Ihr 'AfterBuild'-Ziel hat keine Ausgänge. Es scheint, dass MSBuild dieses Ziel überspringt und denkt, dass es aktuell ist. Fügen Sie Ausgaben ('Web.Config' in Ihrem Fall) zu Ihren' AfterBuild'-Zielausgaben hinzu. – Romeo
Vielleicht "BeforeBuild" verwenden? Haben Sie web.config in csproj enthalten? Ich glaube, dass die meisten Publishing-Aktivitäten auf Elemente im Projekt und nicht im Ordner angewiesen sind - obwohl es nicht überprüft wurde. Wenn nicht - Sie können Web einschließen.config im Projekt, während es immer noch von der Quellcodeverwaltung ausgeschlossen – Lanorkin
@Lanorkin - das hat funktioniert! Vielen Dank - bitte posten Sie Ihren Kommentar als Antwort. – avs099