寻找一种简单的方法将所有文件包含在我的MSI的项目的BIN文件夹中

时间:2019-05-03 01:29:16

标签: wix windows-installer

我的项目的输出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中的方法。

4 个答案:

答案 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/

https://github.com/iswix-llc/iswix-tutorials