我已经尝试了许多不同的配置,但我没有达到我的结果。
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>