Ich habe zwei Build-Umgebungen zum Anzielen; Release und Inszenierung. Die Web.config sieht folgendermaßen aus:
<system.web>
<authentication mode="Windows">
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
Ich möchte es umwandeln, indem ich zur Konfiguration von config: Web.Staging.config aufbaue
<system.web>
<authentication mode="Windows">
</authentication>
<authorization xdt:Transform="Replace">
<deny users="?" />
<allow roles="StagingRoles" />
<deny users="*" />
</authorization>
</system.web>
Ich baue von der Kommandozeile aus so:
msbuild buildscript.build /p:Configuration=Staging
Nach dem Build sehe ich die Datei web.config nicht mehr im Build-Artefakt-Ordner. Stimmt hier etwas nicht?
Vielen Dank
Wenn Sie die folgende XML-Datei am Ende der .csproj-Datei für Ihre Webanwendung hinzufügen, stellen Sie sicher, dass die Konfigurationsumwandlung vor jedem Build erfolgt:
<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: Als Antwort auf Ihren Kommentar sollten Sie Web.config als Quellparameter in der Task TransformXml verwenden können (siehe Schritt 2). Wenn Sie die Konfigurationsumwandlung nur im Build-Skript ausführen möchten, befolgen Sie diese Anweisungen:
1) Importieren Sie WebApplication.targets wie folgt in Ihr Build-Skript:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
2) Führen Sie die TransformXml-Buildaufgabe in Ihrem Buildskriptziel aus:
<Target Name="MyBuildScriptTarget">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
...other build tasks...
</Target>
Jonathans Antwort ist gut. Ich habe es leicht angepasst, damit die ursprüngliche Datei Web.config beibehalten werden kann. Dies sind die Zeilen, die ich am Ende meiner .csproj-Datei hinzugefügt habe:
<!-- 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>
Ich kann sehen, dass die Datei web.config durch Ausführen eines Builds in Visual Studio (oder von einer Befehlszeile) aus transformiert wird.
Kleine Verbesserung gegenüber Jonathans Antwort:
Wenn Sie die folgende Zeile zum Importieren der Webziele verwenden, können Sie mit jeder Visual Studio-Version kompatibel sein. Beachten Sie, dass dies nicht an Version 10.0 gebunden ist
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />
Mit Build Transformation mit Jenkins sehe ich auch, dass web.config nicht transformiert wird. Die eigentliche Transformation findet jedoch statt, wenn Sie die Implementierung durchführen. Ich verwende einen All-in-One-Befehl msbuild, um das Erstellen und Bereitstellen zusammen auszuführen.
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"
nach dem Ausführen können Sie auf dem Server überprüfen, ob die Umwandlung stattfindet.