我正在尝试从自定义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
?
答案 0 :(得分:1)
没有。但您可以生成(而不是编辑)您的ComponentGroup[@Id="ProductComponents"]
。定义它的文件可以通过将其生成到obj
文件夹并将其动态添加到编译中来“隐藏”。这实际上是HarvestDirectory
以及调用heat
的其他目标。
虽然您的扩展程序是将项目引用和文件添加到项目中,但它还可以添加一个MSBuild Include,用于定义具有BeforeTargets =“Compile”的Target。该Target可以执行生成并将生成的文件添加到Compile ItemGroup。
您必须签订一份合同,扩展名才会为此目的使用特定的ComponentGroup Id。 (Heat使用组件和文件ID的唯一名称来防止冲突。我建议你也这样做,特别是对于“隐藏”的源文件。)