2013-04-10 2 views
6

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.

+0

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

+1

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

+0

@Lanorkin - das hat funktioniert! Vielen Dank - bitte posten Sie Ihren Kommentar als Antwort. – avs099

Antwort

4

Verwenden Sie vielleicht "BeforeBuild"?

BTW Haben Sie web.config in csproj enthalten? Ich glaube, dass die meisten Veröffentlichungen Aktivitäten auf Elemente im Projekt und nicht im Ordner basieren. Sie können die Datei "web.config" in das Projekt einschließen, obwohl Sie sie aus der Quellcodeverwaltung ausgeschlossen haben.

+1

Ich habe "BeforeBuild" Ziel verwendet und es hat funktioniert. – avs099

+0

@ avs099, müssen Sie web.config in das Projekt oder in die Quellcodeverwaltung einbeziehen? (Obwohl es durch die Umwandlung überschrieben wird ...) – Mobigital

+0

@Mobigital ich es nicht einschließen – avs099

Verwandte Themen