Wix Harvest:文件位于不同文件夹时的相同组件/文件ID

时间:2014-09-12 17:42:31

标签: wix heat harvest

所以我可能不会这样做,但在这里:

我有一个应用程序,引用了4个SQL Server程序集

应用必须适用于SQL 2008和2010。

我让这个工作的唯一方法就是让我的应用程序引用我的SQL程序集的“通用”路径。然后在我的MSBuild项目中,我将2008程序集复制到'generic'文件夹并编译我的应用程序。我在2012年再次这样做。

我有像Tools \ Release \ V2008和Tools \ Release \ V2010这样的文件夹。这些文件夹包含所有EXE和所需的DLL(包括4个sql server)。我对这些文件夹运行HEAT。

然而,当我对每个文件夹运行热量时,每个文件夹具有相同的目录ID但不同的组件,我得到2个wxs文件,每个文件具有相同的文件(预期),但每个文件组件和文件ID在2中相同wxs文件。

示例:

MSBuild Command:
    <Exec Command="&quot;$(WixTools)\heat.exe&quot; dir $(DeploymentRoot)\Tools\V2008 -dr TOOLS -cg Tools2008Component -var var.Tools2008Path -gg -scom -sreg -sfrag -srd  -o $(heatOutputPath)\cmp2008ToolsFrag.wxs"/>    

WXS File
    <DirectoryRef Id="TOOLS">
        <Component Id="cmp04831EC1F8BB21C028A7FC875720302F" Guid="*">
            <File Id="fil09727A8BFD32FDCE7C743D6DD2008E7C" KeyPath="yes" Source="$(var.Tools2008Path)\AL3Util.exe" />
        </Component>

MSBuild Command:
        <Exec Command="&quot;$(WixTools)\heat.exe&quot; dir $(DeploymentRoot)\Tools\V2012 -dr TOOLS -cg Tools2012Component -var var.Tools2012Path -gg -scom -sreg -sfrag -srd  -o $(heatOutputPath)\cmp2012ToolsFrag.wxs"/>

WXS file
    <DirectoryRef Id="TOOLS">
        <Component Id="cmp04831EC1F8BB21C028A7FC875720302F" Guid="*">
            <File Id="fil09727A8BFD32FDCE7C743D6DD2008E7C" KeyPath="yes" Source="$(var.Tools2012Path)\AL3Util.exe" />
        </Component>

如何让每个WXS文件都具有唯一的组件和文件ID? 或者 - 我怎样才能做得更好:)

谢谢!

1 个答案:

答案 0 :(得分:5)

ID将是相同的,因为您使用-srd,禁止根目录。在这种情况下,用于生成ID的路径将只是文件名,为具有相同名称的文件生成相同的ID。

您有两种选择:

1)当您执行加热以使用-t收集文件时,使用右转换。

2)收获后使用XslTransform任务(.NET 4)将ID重命名为File_2012_AL3Util和File_2008_AL3Util。

您可以将此XSL应用于您的文件。在下面的示例中,如果元素与“我的文件”匹配,则会删除该元素。对于文件名和&#39; MyID&#39;目录ID。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:wi="http://schemas.microsoft.com/wix/2006/wi">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <!-- Matches both directory name and file name. -->
  <!-- Matches any Component that has its @Directory with same @Id as Directory 'MyID'. -->
  <!-- Function ends-with does not work with heat. -->
  <xsl:template match="//wi:Component[@Directory=//wi:Directory[@Name='MyID']/@Id and substring(wi:File/@Source, string-length(wi:File/@Source) - string-length('MyFile') + 1) = 'MyFile']" />

</xsl:stylesheet>