web-dev-qa-db-fra.com

transformation du fichier web.config à partir de la ligne de commande

J'ai deux environnements de construction à cibler; Libération et mise en scène. Le fichier Web.config ressemble à ceci:

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

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

Je veux le transformer en construisant en staging config: Web.Staging.config

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

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

Je construis en ligne de commande comme ceci:

msbuild buildscript.build /p:Configuration=Staging

Après la construction, le fichier web.config ne s'affiche plus dans le dossier des artefacts de construction. Y a-t-il quelque chose qui ne va pas ici?

Merci

33
sheldon_cooper

Si vous ajoutez le fichier XML suivant au bas du fichier .csproj pour votre application Web, vous vous assurez que la transformation de la configuration a lieu avant chaque construction:

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

Éditer: En réponse à votre commentaire, vous devriez pouvoir utiliser Web.config comme paramètre source dans la tâche TransformXml (voir l'étape 2). Si vous souhaitez uniquement effectuer la transformation de configuration dans le script de construction, procédez comme suit:

1) Importez WebApplication.targets dans votre script de construction de la manière suivante:

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

2) Exécutez la tâche de génération TransformXml dans votre cible de script de génération:

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

La réponse de Jonathan est bonne. Je l'ai légèrement modifié pour que le fichier Web.config d'origine soit conservé. Voici les lignes que j'ai ajoutées au bas de mon fichier .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>

Je peux voir que le fichier web.config est transformé en exécutant une construction dans Visual Studio (ou à partir d'une ligne de commande). 

21
David White

Minime amélioration par rapport à la réponse de Jonathan:

L'utilisation de cette ligne ci-dessous pour importer les cibles Web permettra d'être compatible avec toutes les versions de Visual Studio. Notez que ceci n'est pas lié à la version v10.0

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

En utilisant Build transform avec Jenkins, je constate également que web.config ne se transforme pas. Cependant, la transformation réelle a lieu lors du déploiement. J'utilise une commande msbuild tout en un pour faire la construction et déployer ensemble.

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"

et une fois exécuté, vous pouvez vérifier sur le serveur que la transformation a bien lieu.

0
Sandeep