2012-05-08 30 views
32

Ho due ambienti di generazione da indirizzare; Release e Staging. Web.config si presenta così:Trasforma file web.config dalla riga di comando

<system.web>  
    <authentication mode="Windows"> 
    </authentication> 

    <authorization> 
     <deny users="?" /> 
    </authorization> 
</system.web> 

voglio trasformarla con la costruzione di config messa in scena: Web.Staging.config

<system.web>  
    <authentication mode="Windows"> 
    </authentication> 

    <authorization xdt:Transform="Replace"> 
     <deny users="?" /> 
     <allow roles="StagingRoles" /> 
     <deny users="*" /> 
    </authorization> 
</system.web> 

costruisco da linea di comando come questo:

msbuild buildscript.build /p:Configuration=Staging 

Dopo la generazione, non vedo il file web.config trasformato nella cartella delle risorse di build. C'è qualcosa di sbagliato qui?

Grazie

risposta

31

Se si aggiunge il seguente codice XML per la fine del file Csproj per l'applicazione Web, il candidato dovrà garantire che si verifica la trasformazione di configurazione prima di ogni costruzione:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> 
<Target Name="BeforeBuild"> 
    <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" /> 
</Target> 

Edit : In risposta al tuo commento, dovresti essere in grado di usare Web.config come parametro sorgente nell'attività TransformXml (vedi il punto 2). Se si desidera solo per eseguire la configurazione di trasformare in script di build, seguire le seguenti istruzioni:

1) I WebApplication.targets nel vostro script di build in questo modo:

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

2) Eseguire il compito Transformxml costruire in il tuo target script di costruzione:

<Target Name="MyBuildScriptTarget"> 
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" /> 
    ...other build tasks... 
</Target> 
+0

Grazie per la rapida risposta. Il problema con questo è, avrò bisogno di mantenere un altro file di configurazione: Web.base.config. Quando creo una soluzione con VS, trasformerà Web.config che non è necessario. Voglio la trasformazione quando eseguo lo script di compilazione. –

+0

@sheldon_cooper Ho aggiornato la mia risposta. –

+0

Questo funziona, ma un problema. Quando si verifica la trasformazione, viene visualizzato un errore simile al seguente: Il file Web.config viene utilizzato da un altro processo.Ho chiamato questo dopo l'obiettivo di compilazione. –

17

La risposta di Jonathan è buona. L'ho ottimizzato leggermente per consentire il mantenimento del file Web.config originale. Queste sono le linee che ho aggiunto al fondo del mio file Csproj:

<!-- the step to copy the config file first avoids a 'File is being used by another process' error --> 
    <Target Name="BeforeBuild"> 
    <Copy SourceFiles="Web.config" DestinationFiles="Web.temp.config" OverwriteReadOnlyFiles="True" /> 
    <TransformXml Source="Web.temp.config" Transform="Web.$(Configuration).config" Destination="Web.config" /> 
    </Target> 
    <Target Name="AfterBuild"> 
    <Copy SourceFiles="Web.temp.config" DestinationFiles="Web.config" OverwriteReadOnlyFiles="True" /> 
    <Delete Files="Web.temp.config" /> 
    </Target> 

posso vedere che il file web.config si trasforma eseguendo un accumulo all'interno di Visual Studio (o da una riga di comando).

+0

Questa risposta è molto meglio b/c quando stavo testando ha cambiato il mio file web.config originale nel mio progetto VS –

+1

c'è un errore nell'XML. In TransformXml devi scambiare sorgente e destinazione. Altrimenti la trasformazione non viene applicata. Ad ogni modo per la tua risposta! dopo giorni di ricerca sembra essere l'unica risposta corretta nel Web – AlexProutorov

+0

Eccellente. Grazie. Sembra davvero che non dovremmo * aver * bisogno di farlo (e non ne ho avuto bisogno prima) ma hey, funziona ... –

5

piccolo miglioramento rispetto la risposta di Jonathan:

Usando questa linea di seguito per importare gli obiettivi web permetterà di essere compatibile con qualsiasi versione di Visual Studio. Nota: questo non è legato alla versione v10.0

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" /> 
0

Utilizzando Build trasformare con Jenkins, vedo anche che web.config non trasforma, tuttavia, l'effettiva trasformazione avviene quando si fa il deploy. Io uso un comando all in one msbuild per creare e distribuire insieme.

MSBuild MyProj.csproj /P:Configuration=Release /P:DeployOnBuild=True /P:DeployTarget=MsDeployPublish /P:MsDeployServiceUrl=https://your server/msdeploy.axd /P:AllowUntrustedCertificate=True /P:MSDeployPublishMethod=WMSvc /P:CreatePackageOnPublish=True /P:UserName=username /P:Password=password1 /P:DeployIISAppPath="Default Web Site or name of your website"

e ha funzionato una volta, è possibile verificare sul server che la trasformazione avviene.

Problemi correlati