将Wix组件与ComponentGroup分离

时间:2014-03-07 23:39:19

标签: wix

我正在尝试从自定义Visual Studio扩展程序生成Wix源代码。因此,我希望能够(某种程度上)将一个文件(加上项目引用)添加到Wix项目中,并将新的DLL添加到产品中。

举个例子:

<Product Id="*" Name="blah" Version="..." Manufacturer="foo" UpgradeCode="...">
    <Package InstallerVersion="200" ... />

    <MajorUpgrade DowngradeErrorMessage="..." />
    <MediaTemplate EmbedCab="yes" />

        <Feature Id="ProductFeature" Title="blah" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
        <!-- Custom actions, Directories, etc .... -->
</Product>

然后在单独的文件中(我想要生成),我有一些片段:

<Fragment>
    <DirectoryRef Id="MYINSTALLDIR">
       <Component Id="CMP_FILE1" Guid="...">
         <File Id="FILE1" Source="file1.dll" Assembly=".net" KeyPath="yes" />
       </Component>
   </DirectoryRef>
</Fragment>

<Fragment>
    <DirectoryRef Id="MYINSTALLDIR">
       <Component Id="CMP_FILE2" Guid="...">
         <File Id="FILE2" Source="file2.dll" Assembly=".net" KeyPath="yes" />
       </Component>
   </DirectoryRef>
</Fragment>

到目前为止一切顺利。问题是我需要把它们绑在一起,比如:

<Fragment>
  <ComponentGroup Id="ProductComponents">
    <ComponentRef Id="CMP_FILE1" />
    <ComponentRef Id="CMP_FILE2" />
  </ComponentGroup>
</Fragment>

这样可行,但我不想这样做,因为当我想添加下一个文件时需要编辑ComponentGroup

所以我想尝试将信息本地化到我添加的文件中。我可以忍受它始终是同一个功能的一部分。

我尝试将Feature属性添加到Component元素:

<Fragment>
    <DirectoryRef Id="MYINSTALLDIR">
       <Component Id="CMP_FILE1" Guid="..." Feature="ProductFeature">
         <File Id="FILE1" Source="file1.dll" Assembly=".net" KeyPath="yes" />
       </Component>
   </DirectoryRef>
</Fragment>

但似乎没有将Component添加到父功能(在构建时从Wix发出空媒体表警告,并且Orca确认了它)。

我还尝试将ComponentGroup添加到每个生成的文件中,但当然我不能复制Id属性,而唯一Id只会将耦合问题推到{{1} }} ...

有没有办法添加Feature而无需编辑Component

1 个答案:

答案 0 :(得分:1)

没有。但您可以生成(而不是编辑)您的ComponentGroup[@Id="ProductComponents"]。定义它的文件可以通过将其生成到obj文件夹并将其动态添加到编译中来“隐藏”。这实际上是HarvestDirectory以及调用heat的其他目标。

虽然您的扩展程序是将项目引用和文件添加到项目中,但它还可以添加一个MSBuild Include,用于定义具有BeforeTargets =“Compile”的Target。该Target可以执行生成并将生成的文件添加到Compile ItemGroup。

您必须签订一份合同,扩展名才会为此目的使用特定的ComponentGroup Id。 (Heat使用组件和文件ID的唯一名称来防止冲突。我建议你也这样做,特别是对于“隐藏”的源文件。)