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

时间:2012-06-25 18:58:38

标签: asp.net-mvc asp.net-mvc-3 msbuild web-config msdeploy

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

TL; DR

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

背景

  • 我有一个WebApp(MVC3),一个Core应用程序(CS Class Lib)和两个测试类库,每个库都有一个。
  • 我的解决方案中有一个使用MSBuild编译的构建脚本。
  • 其中一个MSBuild目标使用MSDeploy
  • 部署到IIS服务器
  • 这个过程到目前为止都是手动和通过CruiseControl.NET

目标

我想将Web.Config转换添加到此过程。我想我最初会做一些简单的事情,比如名为“PEAppsEnvironmentName”的应用程序设置,我会根据当前环境制作Dev,Test或Prod。

到目前为止的理论

对我来说,使用MSDeploy打包时,我似乎没有转换配置文件。

当我将DeployOnBuild选项设置为true运行MSBuild时,它会创建另一个具有适当转换的配置的包。看起来好像我不能完全匹配。最终结果是网页显示“无”(初始设置)而不是转换后的“开发”字符串。

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

代码

我的web.config文件

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

我的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>

1 个答案:

答案 0 :(得分:1)

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

我创建了一个可用于此目的的NuGet包。它被称为package-web。将其添加到Web项目时,它将更新打包过程。创建包时,包中将包含一些其他文件,包括所有web.config转换文件。还将在包旁边创建.ps1文件。您可以使用此脚本发布程序包。它将提示您运行哪个转换以及所有Web Deploy参数。您还可以将响应保存到文件,然后将它们传递给.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。这是一篇关于如何将其集成到build server

的博客