在安装项目中使用 SlowCheetah 的 app.config 转换

Posted

技术标签:

【中文标题】在安装项目中使用 SlowCheetah 的 app.config 转换【英文标题】:Using SlowCheetah's app.config transformations with Setup projects 【发布时间】:2012-02-20 00:24:52 【问题描述】:

我正在使用 SlowCheetah XML Transforms 扩展来处理 app.config 中的类似 web.config 的转换。那部分效果很好。

我添加了一个设置项目并将其配置为包含第一个项目的项目输出。我注意到当我运行安装程序时,它安装了未转换的 app.config。查看主输出 Outputs(说快 10 倍),我注意到它在 Project\bin\Debug\Project.exe 中找到二进制文件,但 Project.exe.config 来自 Project\app.config 而不是 Project\bin\Debug\Project.exe.config

我可以从主输出中排除 app.config,并将路径硬编码到特定配置的 app.config (Project\bin\Debug\Project.exe.config),但无论我使用哪种配置,我都会得到相同的 app.config建造它。

是否有一种解决方法可以在安装项目中获取适当的转换 app.config?

【问题讨论】:

【参考方案1】:

您好,我们计划在接下来的几天内发布一个支持 ClickOnce 的新版本。如果您之前需要构建插件而不是修复,请与我联系,我可以将其发送给您。

【讨论】:

我刚刚发布了一个新版本,你可以试试吗? 最新版本很好用,谢谢!有点令人困惑的一件事是,扩展名显示其版本为 2.0,但 download page 更改历史记录显示为 1.3。 谢谢我已将下载页面更改为状态 2.0【参考方案2】:

这可能不是您正在寻找的答案,但我之前曾为如何将正确的 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="&quot;$(ProgramFiles)\Microsoft Visual Studio 10.0\Common7\IDE\devenv&quot; &quot;$(SolutionRoot)\MyProject.sln&quot; /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>

【讨论】:

以上是关于在安装项目中使用 SlowCheetah 的 app.config 转换的主要内容,如果未能解决你的问题,请参考以下文章

无法从程序集中加载“SlowCheetah.Xdt.TransformXml”任务

slowcheetah 不适用于 app.config

在另一个项目中添加 Slow Cheetah 转换的配置文件作为参考

使用慢速猎豹时,上下文菜单在控制台作业中不显示“添加转换”

如何在数据库项目中创建对动态数据库名称的引用?

Linux 下开wifi热点