我们在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>
有办法解决这个问题吗?
提前致谢!
答案 0 :(得分:3)
我在一篇名为Automated Patch Building with WiX and Visual Studio的帖子中写了这篇博文。
以下是基本步骤:
答案 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中。不觉得不可能,但它可能会给我和其他人一些新的头痛来处理......;)