38

我有两个构建环境可以定位;发布和分期。Web.config 如下所示:

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

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

我想通过构建到暂存配置来转换它: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 文件。这里有什么问题吗?

谢谢

4

5 回答 5

39

如果您将以下 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>

编辑:响应您的评论,您应该能够使用 Web.config 作为 TransformXml 任务中的源参数(参见步骤 #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>
于 2012-05-08T21:03:13.150 回答
26

乔纳森的回答很好。我稍微调整了一下以允许保留原始的 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>

我可以看到 web.config 文件是通过在 Visual Studio(或从命令行)中运行构建来转换的。

于 2015-06-23T01:19:27.733 回答
12

对乔纳森的回答的微小改进:

使用下面的这一行来导入 Web 目标将允许与任何 Visual Studio 版本兼容。请注意,这与 v10.0 版本无关

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />
于 2016-12-02T21:10:54.787 回答
2

使用 Jenkins 构建转换,我还看到 web.config 没有转换,但是,实际转换发生在您进行部署时。我使用一个多合一的 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"

运行后,您可以在服务器上验证是否发生了转换。

于 2017-07-18T05:05:59.597 回答
0

如果您想继续使用命令行,请将其添加到命令中:

/p:UseWPP_CopyWebApplication=true /p:PipelineDependsOnBuild=false

来源

于 2021-08-13T23:29:10.043 回答