我有两个目标构建环境;发布和分期。 Web.config看起来像这样:
<system.web>
<authentication mode="Windows">
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
我想通过构建到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>
我从命令行构建如下:
msbuild buildscript.build /p:Configuration=Staging
构建之后,我没有看到在构建工件文件夹中转换的web.config文件。这里有什么问题吗?
由于
答案 0 :(得分:33)
如果将以下xml添加到Web应用程序的.csproj文件的底部,您将确保在每次构建之前进行配置转换:
<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>
编辑:为了回应您的评论,您应该能够在TransformXml任务中使用Web.config作为源参数(请参阅步骤2)。如果您只想在构建脚本中执行配置转换,请按照以下说明操作:
1)在构建脚本中导入WebApplication.targets,如下所示:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
2)在构建脚本目标中执行TransformXml构建任务:
<Target Name="MyBuildScriptTarget">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
...other build tasks...
</Target>
答案 1 :(得分:21)
Jonathan的回答很好。我稍微调整它以允许保留原始的Web.config文件。这些是我添加到.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>
我可以看到通过在Visual Studio(或命令行)中运行构建来转换web.config文件。
答案 2 :(得分:8)
对乔纳森的回答微微改进:
使用下面的这一行导入Web目标将允许与任何Visual Studio版本兼容。请注意,这与版本v10.0
无关<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />
答案 3 :(得分:0)
对Jenkins使用Build转换,我也看到web.config没有转换,但是,在进行部署时会发生实际的转换。我使用一个all in one msbuild命令来进行构建和部署。
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"
一旦运行,您就可以在服务器上验证是否发生了转换。