1

我在单个 MSI 中有一个.exe文件和.dllIE 插件)。当用户第一次安装它时,两个文件都将安装,并且在指定文件夹下的程序文件中,它将创建.exe.dll. 现在我只想为.dllIE 插件)提供更新。当我使用更新文件再次生成 MSI 时,.dll如何省略.exe不加载到 MSI 中的文件。由于.exe文件非常大,用户需要花费大量时间来更新 MSI。有没有办法.exe在新生成的 msi 中省略组件,或者请建议我另一种方法来实现这一点。

Product.wxs :

 <?xml version="1.0" encoding="UTF-8"?>
      <?define ProductVersion = "0.0.4"?>
    <?define ProductUpgradeCode = "d3170abf-b41c-4274-a3a0-85576052f35c"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
      <Product Id="*" Name="saranSample" Language="1033" Version="$(var.ProductVersion)" Manufacturer="example" UpgradeCode="$(var.ProductUpgradeCode)">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of product is already installed." AllowSameVersionUpgrades="no" AllowDowngrades="no" />
        <MediaTemplate EmbedCab="yes" />

    <Upgrade Id="$(var.ProductUpgradeCode)">
      <UpgradeVersion Minimum="$(var.ProductVersion)" OnlyDetect="yes" 
     Property="NEWERVERSIONDETECTED"/>
      <UpgradeVersion Minimum="0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="no" Property="OLDERVERSIONBEINGUPGRADED"/>
    </Upgrade>
    <InstallExecuteSequence>
      <Custom Action="Filecleaner" After="InstallFinalize"></Custom>
    </InstallExecuteSequence>
    <Condition Message="A newer version of this software is already installed.">NOT NEWERVERSIONDETECTED</Condition>

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="saranSample_$(var.ProductVersion)">
          <Component Id="exeFiles" Guid="12345678-1234-1234-1234-222222222222">
            <File Id="exe" Source="$(sys.CURRENTDIR)npp.7.5.7.Installer.exe" KeyPath="yes"/>
          </Component>
          <Component Id="dllFiles" Guid="12345678-1234-1234-1234-222222222223">
            <File Id="dll" Source="$(sys.CURRENTDIR)saran.dll" KeyPath="yes"/>
          </Component>
        </Directory>
            </Directory>
        </Directory>

    <Feature Id="ProductFeature" Title="saranSample" Level="1">
      <ComponentRef Id="exeFiles"/>
      <ComponentRef Id="dllFiles"/>
    </Feature>
4

1 回答 1

1

补丁:这本质上是补丁的用途——它只包括自上次发布以来已更改的 MSI 的“点点滴滴”,不包括二进制分发包中的所有其他内容。

但请注意,MSI 补丁非常复杂,基本上需要完美的软件包,并且 100% 符合MSI 组件规则——这在现实世界中确实很少见(Rob Mensching 的 101 关于组件规则- 他是 WiX创造者)。要成功实现这一点,您需要非常小心如何在 MSI 中处理组件设计、自定义操作(复杂的调节,它们是否应该在修补期间运行?等等)以及其他方面。

修补只是一种用于已在工作的升级的分发机制。换句话说,您可以将常规 MSI 更新(例如主要和次要升级)打包为补丁。尽管理论上可以进行大升级补丁,但我使用小升级补丁的运气更好,尽管小升级在现实世界中使用起来相当复杂。另一方面是,如果原始的完整版本包不能正常工作,那么再多的补丁测试或调整都无法工作。

尝试的答案:因此,尝试的答案是,您确实可以基于有效的 MSI 更新提供较小的分发补丁包,但是让它正常工作并不是一件容易的事,如果您的 MSI 经验有限且时间有限,这可能是不明智的专注于学习技术的来龙去脉。I guess you have to ask yourself how important this small distribution package really is in a world of broadband internet and fast computer I/O?

如果被迫实施这个补丁,我会使用一个小的升级补丁,我会将补丁设置为使用位级补丁。这意味着只包含整个文件,而不是先前和新二进制文件的二进制差异 - 我发现这是不必要的复杂性和风险。这个想法是使补丁更健壮(Why? What happens with bit-level patching when the file in question is signed? Frankly I have no idea)。

技术细节: 忏悔时间:尽管我多年来一直在做 MSI,但我从未使用过 WiX 来创建补丁。我使用 Installshield 和 Wise 制作补丁,后者对我有用(Wise)。为了使用 WiX 制作补丁,我知道要开始使用的资源是:


一些选定的链接

微软链接

更多链接

于 2018-07-23T13:55:54.693 回答