这可能不是您正在寻找的答案,但我之前曾为如何将正确的 app.config 文件放入安装项目而苦苦挣扎。我有一个使用转换的 TFSBuild.proj msbuild 文件。我认为 SlowCheetah 转换使用相同的 msbuild 任务,但我可能不正确。当使用转换文件时,SlowCheetah 无疑提供了更有用的用户体验。我的构建文件采用了稍微不同的方法。在自动构建结束时,我想为每个目标部署环境生成安装程序。我使用了许多 msbuild 扩展,包括TransformXml构建任务 - 以下并非全部需要,但 FWIW 这些是导入:
<!-- import extensions -->
<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks"/>
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<UsingTask TaskName="TransformXml"
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
我定义了以下环境:
<ItemGroup>
<!-- target deployment environments -->
<Configs Include="Prod" />
<Configs Include="Staging" />
<Configs Include="Test" />
</ItemGroup>
然后标准的AfterCompileSolution目标包含对为每个环境生成安装程序的目标的调用:
<Target Name="AfterCompileSolution">
<!-- Create installers for target deployment environments -->
<CallTarget Targets="MyProject" />
</Target>
<Target Name="MyProject" Outputs="%(Configs.Identity)">
<ItemGroup>
<MyProjectTempConfig Include="$(SolutionRoot)\MyProjectService\Temp.config" />
<MyProjectConfigFrom Include="$(SolutionRoot)\MyProjectService\App.%(Configs.Identity).config" />
<MyProjectConfigTo Include="$(SolutionRoot)\MyProjectService\App.config">
<Attributes>ReadOnly</Attributes>
</MyProjectConfigTo>
</ItemGroup>
<Message Text="MyProject - Target environment: %(Configs.Identity)" />
<!-- transform app.config using appropriate -->
<Copy SourceFiles="@(MyProjectConfigTo)"
DestinationFiles="@(MyProjectTempConfig)"
OverwriteReadOnlyFiles="true"
ContinueOnError="true"
Condition="!Exists(@(MyProjectTempConfig))"/>
<File TaskAction="RemoveAttributes" Files="@(MyProjectConfigTo)"/>
<TransformXml Source="@(MyProjectTempConfig)"
Transform="@(MyProjectConfigFrom)"
Destination="@(MyProjectConfigTo)" />
<!-- run setup -->
<Exec Command=""$(ProgramFiles)\Microsoft Visual Studio 10.0\Common7\IDE\devenv" "$(SolutionRoot)\MyProject.sln" /build Release /project MyProjectService.Setup"/>
<!-- rename output for target deployment environment -->
<Copy SourceFiles="$(SolutionRoot)\MyProjectService.Setup\Release\MyProjectService.msi"
DestinationFiles="$(OutDir)\%(Configs.Identity)_MyProjectService.msi"
OverwriteReadOnlyFiles="true"
ContinueOnError="true"/>
</Target>