如何使用 MSBuild 或 MSDeploy 执行 web.config 转换



我已经尝试了许多不同的配置,但我没有达到我的结果。

博士

我正在尝试将配置转换添加到我的构建过程中,并且正在寻找从 MSBuild 执行此操作的正确方法,以便它通过 MSDeploy 显示在我的部署中。

背景

  • 我有一个WebApp(MVC3),一个核心应用程序(CS类库)和两个测试类库,每个库一个。
  • 我的解决方案中有一个使用 MSBuild 进行编译的生成脚本。
  • 其中一个 MSBuild 目标使用 MSDeploy 部署到 IIS 服务器
  • 到目前为止,此过程正在手动或通过 CruiseControl.NET

目标

我想将 Web.Config 转换添加到此过程。我想一开始我会做一些简单的事情,比如一个名为"PEAppsEnvironmentName"的应用程序设置,我会根据当前环境进行开发、测试或生产。

到目前为止的理论

对我来说,在使用

MSDeploy 打包时,我似乎没有转换配置文件。

当我在将 DeployOnBuild 选项设置为 true 的情况下运行 MSBuild 时,它会创建另一个具有适当转换配置的包。似乎不知何故我无法让一切都匹配。最终结果是网页显示"无"(初始设置)而不是转换后的"开发"字符串。

我想如果我能在打包阶段找到如何使用MSDeploy来转换MSConfig,我会很高兴。

法典

我的网络配置文件

<appSettings>
      <add key ="PEAppsEnvironmentName" value="None"/>
      ...  
</appSettings>

My Web.Dev.config 文件

<appSettings>
    <add key ="PEAppsEnvironmentName" xdt:Transform="Replace" xdt:Locator="Match(key)" value="Development" />
</appSettings>

我的 MSBuild 目标

显示默认配置为"Dev"的属性组

<PropertyGroup>
    <Configuration Condition="'$(Configuration)' == ''">Dev</Configuration>
</PropertyGroup>

我的 MSBuild"编译"目标

   <Target Name="Compile" DependsOnTargets="Init">
        <MSBuild Projects="@(SolutionFile)" Targets="Rebuild" Properties="OutDir=%(BuildArtifacts.FullPath);DeployOnBuild=True"/>
    </Target>

我的 MSBuild"包"目标

<Target Name="Package" DependsOnTargets="Compile;Test">
    <PropertyGroup>
        <PackageDir>%(PackageFile.RootDir)%(PackageFile.Directory)</PackageDir>
        <Source>%(WebSite.FullPath)</Source>
        <Destination>%(PackageFile.FullPath)</Destination>
    </PropertyGroup>
    <MakeDir Directories="$(PackageDir)"/>
    <Exec Command='"@(MSDeploy)" -verb:sync -source:iisApp="$(Source)" -dest:package="$(Destination)" '/>
</Target>

我的 MSBuild"部署"目标

(为PW等擦洗)

   <Target Name='Deploy' DependsOnTargets='Package'>
        <PropertyGroup>
            <Source>%(PackageFile.FullPath)</Source>
        </PropertyGroup>
        <Exec Command ='"@(MsDeploy)" -verb:sync -source:package="$(Source)" -dest:iisApp=PEApps,computerName=$(WebServerName),username=[User],password=[Password]'/>
    </Target>
这个问题有很多

,我不确定我是否和你完全在同一页面上,但我会总结我对你所问问题的印象。您有一个现有的 Web 项目,该项目与其他项目一起位于解决方案中。您需要能够打包 Web 项目,以便可以将其发布到多个目标。

我创建了一个可用于此确切目的的NuGet包。它被称为包网。当您将其添加到 Web 项目时,它将更新打包过程。创建包时,包中将包含一些其他文件,包括所有 web.config 转换文件。还将在包旁边创建一个 .ps1 文件。可以使用此脚本发布包。它将提示你输入要运行的转换以及所有 Web 部署参数。还可以将响应保存到文件,然后将其传递到 .ps1 文件,以便执行非交互式发布。我在 http://nuget.org/packages/PackageWeb 上制作了一个 5 分钟的视频包装网:http://sedodream.com/2012/03/14/PackageWebUpdatedAndVideoBelow.aspx。仅供参考,这尚未与VS 2012一起使用,但我正在修复,并且应该在VS 2012发布时对其进行更新。

如果您觉得这没有用,您可以看到我如何在 https://github.com/sayedihashimi/package-web 实现解决方案,并且您应该看到您需要执行的所有操作的示例。

仅供参考,如果您需要在包创建时转换除 web.config 之外的任何文件,那么您应该看看我的 VS 扩展 SlowCheetah。下面是一个关于如何将其集成到构建服务器的博客。

最新更新