2013-04-10 18 views
6

Ho la seguente configurazione: Soluzione ASP.Net MVC .Net 4.0 con 5 progetti in essa e diverse configurazioni di soluzioni (Site1-Stage, Site1-Live, Site2-Stage, ecc.). Il motivo è semplice: distribuiamo la stessa base di codice a più server con diverse impostazioni di configurazione.MSBuild - come forzare la destinazione "AfterBuild" quando eseguo la distribuzione?

Per gestire queste configurazioni, utilizzo l'approccio descritto da Troy Hunt nel suo articolo You're deploying it wrong! TeamCity, Subversion & Web Deploy part 1: Config transforms. In 2 parole - non ho web.config nel mio SVN pronti contro termine, invece ho Web.Base.Config, Web.Site1-Stage.Config, ecc e XmlTransformation compito nel progetto AfterBuild bersaglio. Durante la compilazione, la richiesta web.config è generato in base configurazione selezionata:

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

Qui viene il problema: quando sono eseguire MSBuild come questo:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild 

tutto va beh, web.config è generato correttamente per la configurazione Site1-Stage. Tuttavia, se corro questo comando:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild /P:DeployOnBuild=True 

ottengo il seguente errore:

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

Ho provato ad aggiungere in modo esplicito target "AfterBuild" in MSBuild riga di comando:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild,AfterBuild /P:DeployOnBuild=True 

ma ha provocato lo stesso errore.

Perché ho bisogno di questo: è un esempio molto isolato, e in realtà sto cercando di impostare la pubblicazione automatica dal server CI TeamCity. Penso che se aggiungo il nuovo passo di costruzione con il runner "Visual Studio (sln)" PRIMA della mia attuale fase di pubblicazione, funzionerebbe, prima ricostruirà il progetto (e genererà web.config) - e quindi pubblicherà. Tuttavia, ho molti passaggi di pubblicazione (circa 20 ora) e vorrei evitarlo. La mia comprensione è che il processo "Pubblica" fa la build come parte di esso, quindi mi piacerebbe "riutilizzarlo".

La domanda è: come dovrei modificare la riga di comando di MSBuild per forzare la trasformazione della configurazione?

Grazie.

+0

La destinazione 'AfterBuild' non ha uscite. Sembra che MSBuild salti questo obiettivo pensando che sia aggiornato. Aggiungi uscite ('Web.Config' nel tuo caso) agli output di destinazione' AfterBuild'. – Romeo

+1

Forse usare "BeforeBuild"? BTW hai web.config incluso in csproj? Credo che la maggior parte delle attività di pubblicazione si basino su elementi nel progetto piuttosto che in una cartella, anche se non sono stati controllati. In caso contrario, puoi includere Web.config in progetto, mentre lo hai ancora escluso dal controllo del codice sorgente – Lanorkin

+0

@Lanorkin - che funzionava! Grazie mille - per favore pubblica il tuo commento come risposta. – avs099

risposta

4

Forse usare "BeforeBuild"?

BTW hai web.config incluso in csproj? Credo che la maggior parte delle attività di pubblicazione si basino su elementi nel progetto piuttosto che nella cartella. È possibile includere web.config nel progetto, pur continuando a escluderlo dal controllo del codice sorgente.

+1

Ho usato la destinazione "BeforeBuild" e ha funzionato. – avs099

+0

@ avs099, è necessario includere web.config nel progetto o nel controllo del codice sorgente? (anche se verrà sovrascritto dalla trasformazione ...) – Mobigital

+0

@Mobigital non lo includo – avs099

Problemi correlati