WIX:动态生成补丁

时间:2015-09-01 13:52:53

标签: wix patch

我们在WIX(目前为3.9)上构建了许多安装,例如我们使用它来收集不同的组件并且它确实非常流畅。一切都是自动化的,我们在需要最新安装时进行夜间构建。

我们需要像许多其他公司一样修补一个或多个安装中的许多文件中的一个,但确保我们在不同的安装中找到正确的文件和正确的组件真的很痛苦。 / p>

这是关于这种情况的最佳做法,因为我无法理解我们是否单独使用此设置? AND 我们不想针对一些错误修复进行升级。

这是一个需要解决的问题:

Release 2.0终于发布了,我们有一个完整的系统安装以及几个不同的客户端安装和一个optinal包。

当然,我们在软件中实现了一些陈词滥调,第一个,比如说3个星期我们在系统的不同部分做了大约15个或多或少的关键错误修复。

现在我们觉得我们需要在那里修补安装,并且我们需要为每个安装(MSI)做一个补丁项目然后我们构建它并收集差异并创建补丁以便能够快速发送出去那些已经安装了不同部分的人。

以下是我所做的patch.wxs的片段,但无法找到自动化的方法:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include "InitDefinitions.wxi"?>
  <Patch  AllowRemoval="no" Manufacturer="$(var.Company)" 
          DisplayName="$(var.InstallerProductName), patch $(var.Build)" 
          Description="Small Update Patch" Classification="Update">
    <Media Id="5000" Cabinet="patch.cab" EmbedCab="yes">
      <PatchBaseline Id="RTM"/>
    </Media>

    <PatchFamilyRef Id="SP-$(var.Build)-Patch"/>
  </Patch>

  <Fragment>
    <PatchFamily Id="SP-$(var.Build)-Patch" 
                 Version="$(var.Major).$(var.Minor).$(var.Build).$(var.Revision)" 
                 Supersede="yes">
      <PropertyRef Id="ProductVersion" />
      <!--  
            As I understand it's here I define the changes, 
            but I like this section to be automatic populated during build, 
            or something
      -->
    </PatchFamily>
  </Fragment>
</Wix>

有办法解决这个问题吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

我在一篇名为Automated Patch Building with WiX and Visual Studio的帖子中写了这篇博文。

以下是基本步骤:

  1. 创建初始修补程序文件。您已经使用patch.wxs完成了此操作。
  2. 执行已发布和更新的msis的管理员安装。您可以从服务器位置复制已发布的.msi。我假设您正在使用某种类型的自动构建来构建更新.msi。
  3. 使用Torch.exe生成msis之间的差异。
  4. 构建补丁。使用Candle.exe编译它,使用Light.exe链接它,并使用Pyro.exe创建最终补丁。
  5. 可以在here FireGiant找到有关如何手动运行这些步骤的简单示例。

答案 1 :(得分:1)

根据我到达的这个页面,将焦点从<Patch>切换到<PatchCreation>http://wixtoolset.org/documentation/manual/v3/patching/patch_building.html

不确定为什么在WIX框架中有两种方法可以制作补丁,但是现在我不再使用PatchCreation了!

基本上,我已经将Patch.wxs中的内容改为:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include "InitDefinitions.wxi"?>
  <PatchCreation
      Id="{BAF94FD0-924C-4ED6-8BBF-2F6ACF8B3B3D}"
      CleanWorkingFolder="yes"
      OutputPath="patch.pcp"
      WholeFilesOnly="yes"
        >

    <PatchInformation
        Description="Small Update Patch"
        Comments="Small Update Patch"
        ShortNames="no"
        Languages="1033"
        Compressed="yes"
        Manufacturer="$(var.Company)"/>

    <PatchMetadata
        AllowRemoval="no"
        Description="Small Update Patch"
        ManufacturerName="$(var.Company)"
        MoreInfoURL="http://www.company.com"
        TargetProductName="Sample"
        Classification="Update"
        DisplayName="Sample Patch"/>

    <Family DiskId="5000"
        MediaSrcProp="Sample"
        Name="Sample"
        SequenceStart="5000">
      <UpgradeImage SourceFile="C:\Temp\PatchWork\NewMSI\Install\Product.msi" 
                    Id="SampleUpgrade">
        <TargetImage SourceFile="C:\Temp\PatchWork\ReleasedMSI\Install\Product.msi" 
                      Order="2" Id="SampleTarget" IgnoreMissingFiles="no" />
      </UpgradeImage>
    </Family>

    <PatchSequence PatchFamily="SamplePatchFamily"
        Sequence="2.0.0.1"
        Supersede="yes" />

  </PatchCreation>
</Wix>

并且还将我的VS项目中的PostBuild事件更改为:

FOR /D /R "C:\Temp\PatchWork\ReleasedMSI\Install" %%X IN (*.*) DO RD /S /Q "%%X"
FOR /D /R "C:\Temp\PatchWork\NewMSI\Install" %%X IN (*.*) DO RD /S /Q "%%X"
msiexec.exe /a "C:\Temp\PatchWork\ReleasedMSI\Product.msi" /qb TARGETDIR="C:\Temp\PatchWork\ReleasedMSI\Install"
msiexec.exe /a "$(SolutionDir)Installations\Product.Setup\bin\Release\Product.msi" /qb TARGETDIR="C:\Temp\PatchWork\NewMSI\Install"
candle.exe "$(SolutionDir)Installations\Product.Patch\Patch.wxs"
light.exe  "$(TargetDir)Patch.wixobj" -out "$(TargetDir)Patch.pcp"
msimsp.exe -s "$(TargetDir)Patch.pcp" -p "$(TargetDir)Patch.msp" -l "$(TargetDir)Patch.log"

我有一个带有内容的漂亮的补丁文件,乍一看似乎是正确的。需要更多关于名称,描述等的工作和决定。但基线似乎就在那里! :)

...下一步是将它挂钩到我们用于某些msi安装程序的bundle / bootstrapper中。不觉得不可能,但它可能会给我和其他人一些新的头痛来处理......;)