2

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

TL;博士

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

背景

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

目标

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

到目前为止的理论

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

当我在 DeployOnBuild 选项设置为 true 的情况下运行 MSBuild 时,它会创建另一个具有适当转换的 config 的包。似乎以某种方式我无法使所有内容都匹配。最终结果是网页显示“None”(初始设置)而不是转换后的“Development”字符串。

我想如果我能在打包阶段找到如何使用 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>
4

1 回答 1

1

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

我创建了一个 NuGet 包,可用于此确切目的。它被称为package-web。当您将它添加到您的 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。这是一篇关于如何将其集成到构建服务器中的博客。

于 2012-08-09T03:30:54.093 回答