我的项目的输出BIN文件夹中有很多文件(数百个)。我只需要一个安装程序,即可将文件包含在MSI安装程序的bin文件夹中。
在WIX安装程序项目中,我有以下目标使用收割工具并生成bin文件夹中所有文件的列表,稍后,我在WIX定义中引用它们:
<Target Name="GenerateHeat">
<HeatDirectory Directory="..\MyApp\bin\Debug"
PreprocessorVariable="var.HeatPath" OutputFile="HarvestedFiles.wxs"
ComponentGroupName="HarvestedFiles" DirectoryRefId="FOLDER1"
AutogenerateGuids="true" ToolPath="$(WixToolPath)"
SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" />
</Target>
有什么方法可以简单地将所有文件包含在bin文件夹中,然后将它们包含在MSI中,而不生成中间文件列表?我更喜欢指定BIN文件夹名称,WIX将它们包含在<ComponentGroup>
中,因此我可以在我的<Product>
更新和澄清
这个问题与MSI的工作方式无关。这是关于WIX如何在不指定<Component>
和<File>
三明治的每个文件名的情况下将文件夹的内容复制到MSI中的方法。
答案 0 :(得分:1)
有没有办法简单地将所有文件包含在bin文件夹中, 将它们包括在MSI中而不生成中间文件列表?
使用免费版WiX的内置功能无法做到这一点。正如SteinÅsmulpoints out一样,WiX的商业分支可能具有类似的功能。
如果没有商业WiX的选择,并且您准备使用主要未记录的API花费大量时间在C#开发上,则可以编写一个WiX编译器扩展,将条目添加到文件中和 Component 表基于给定的源目录路径。它还可以生成组件组,可以在其他地方引用。
我过去确实做到了,但这当然不是一件容易的事。通常,在进行诸如生成组件GUID之类的操作之前,还应该对组件规则和MSI有很好的了解。您将在下面找到一些伪代码。在走这条路线之前,值得一看的是是否有人创建了这样的开源WiX扩展。
使用这种编译器扩展可以实现这种创作:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:ex="MyExtensionUri">
<Product ... >
<Feature Id="ProductFeature" Title="MyFeature" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<ex:ComponentGroupFromFiles Id="ProductComponents"
Directory="INSTALLFOLDER"
Source="MyApp\bin"
Wildcard="*"/>
</Fragment>
</Wix>
这里有一些伪代码用于编译器扩展。主要是用作探索WiX源“ Compiler.cs”的关键字。
覆盖Wix.CompilerExtension.ParseElement()
来解析扩展元素的属性。
创建组件组并由产品引用它:
Wix.Row compGroupRow = Core.CreateRow(sourceLineNumbers, "WixComponentGroup");
compGroupRow[0] = myComponentGroupId;
Core.CreateWixGroupRow( sourceLineNumbers, Wix.ComplexReferenceParentType.Product, Core.ActiveSection.Id, Wix.ComplexReferenceChildType.ComponentGroup, myComponentGroupId );
对于每个组件/文件:
// Add record to the Component table
Wix.Row compRow = Core.CreateRow( sourceLineNumbers, "Component" );
// TODO: Assign data to compRow[0..5] according to MSI "Component" table documentation
// Add this component to the component group.
Core.CreateComplexReference( sourceLineNumbers, Wix.ComplexReferenceParentType.ComponentGroup, myComponentGroupId, "", Wix.ComplexReferenceChildType.Component, myComponentId, false );
// Add record to the File table.
Wix.Row fileRow = Core.CreateRow( sourceLineNumbers, "File" );
// TODO: Assign data to fileRow[0..2] and [6] according to MSI "File" table documentation. Columns 3, 4, 5, 7 are written by the WiX binder at a later time! Set them to null (if nullable) or 0.
// Create required metadata for WiX
Wix.WixFileRow wixFileRow = (Wix.WixFileRow) Core.CreateRow(sourceLineNumbers, "WixFile");
// TODO: Assign wixFileRow.File, wixFileRow.Directory, wixFileRow.DiskId, wixFileRow.Source
// Set wixFileRow.Attributes to 1 if you have generated a short file name.
// Add reference to the Media table
Core.CreateWixSimpleReferenceRow( sourceLineNumbers, "Media", diskId );
用于生成“组件/文件”表列数据的有用实用程序:
Core.GenerateIdentifier()
Core.GenerateShortName()
如何将组件添加到合并模块?这留给读者练习。只需在WiX的“ Compiler.cs”中找到代码即可。
答案 1 :(得分:1)
FireGiant :我相信WiX(FireGiant)的商业分支为此提供了一个模块。 HeatWave Harvesting-或类似的东西。如果我没有记错的话,它是WiX expansion pack的一部分。它允许进行高级收集以创建MSI文件以及我可能不知道的其他格式。除此以外,我几乎对模块一无所知。哦,它还支持从64位COM文件中提取COM-目前在heat.exe中不起作用。
Tallow :在WiX2时代,有一个名为Tallow的工具是由我不记得其名字的人开发的。它生成WiX标记以从给定的输入文件夹安装文件,甚至使组件GUID保持同步(据我所知)。我在github.com上看到了它的一些副本,但是我下载的存储库中有几处恶意软件,因此没有链接。
石蜡 :我从未使用过的工具是石蜡-应该是更好的牛脂-https://github.com/Wintellect/Paraffin。因为我还没有尝试过,所以我不能多说。快速浏览一下?我不确定是否真的要维护它,但是肯定可以使您从头开始开发自己的解决方案。
答案 2 :(得分:0)
这将与Windows Installer的整个设计概念背道而驰。
Windows Installer管理组件的运行状况/安装状态。它会在所有已安装产品的所有版本中执行此操作。为了使它可行,有 “ Components Rules。”为了使规则在组件的生命周期内可管理,一个组件应该是原子的:一个文件(或多文件.NET程序集)和/或注册表项。
(如果您有选择的话,如果您不喜欢Windows Installer的设计,则不必使用Windows Installer。)
此外,您应该考虑是否应该,如何以及在何处安装bin文件夹中的任何内容。它的基本目的是就地调试。它可能包含以下内容:1)您无权重新分发,2)仅以特定方式被许可重新分发,3)可能已经是目标系统的一部分,4)最好使用其原始安装程序从供应商5)您实际上并不想交付给用户,…。对于这些问题,您可以缩小收获范围或过滤出特定结果。
提示:如果要模块化安装,可以将组件集构建到不同的MSI文件中,并使用WiX的引导程序将它们一起安装。
答案 3 :(得分:0)
除非您谈论Web应用程序/网站(请考虑使用node.js目录结构),否则我建议不要这样做。
对于某个包管理器,我为故事编写了所有数千个文件(^^^),然后使用Heat。
对于所有其他正常情况,我创建了IsWiX。它可以帮助我减少创作/维护安装程序的复杂性和麻烦,同时让我可以控制什么/什么不发货以及什么时候完成或不完成(功能)。
https://iswix.com/2007/06/20/dealing-with-very-large-number-of-files/