web.config文件从命令行转换

时间:2012-05-08 20:51:37

标签: msbuild

我有两个目标构建环境;发布和分期。 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文件。这里有什么问题吗?

由于

4 个答案:

答案 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"

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