Creating a MSI patch (.msp) by hand?
Our team has recently been considering pushing out a minor registry fix to users to modify one particular problematic key. Pretty straightforward stuff, just needed to update 1 key/value inside the registry.
So at the moment, we are using Wix to build .msi installers for the product. While looking into Wix's support for generating .msp patch files, it seems that the only way to create an .msp is a somewhat overcomplicated multi-step process to:
- Get a copy of the original MSI, and compile a new copy of the fixed MSI
- Write a new Wix file that points to both installers
- Compile the Wix file into a .wixobj with Candle to a .psp
- Run Torch/Pyro over before/after snapshots of the original installers and the .psp, or alternatively using MsiMsp.exe
Now my question is, can't I simply describe the registry change into a Wix file and di开发者_运维问答rectly compile it into the .msp, without step 1 and 4 - which is a huge amount of effort for just a simple change?
No. A patch is the delta of two installable images. To generate the delta, even if the difference is very small, you will need both images.
Yes, there is another way, even though you may consider it equally complicated:
- Create an admin install of your "base version" using
msiexec /qn /a <msi-file> TARGETDIR=<absolute-path-of-existing-directory>
(if you run this from a make file or other script, usestart /wait
in front of the command), say into%BASEDIR%
- repeat the above, but into
%UPDDIR%
- Now that you have the installation unpacked inside
%UPDDIR%
, make your changes to the .msi file that will be in the root of that folder ... you should also preferably change the version number ...- If you exchange files, make sure to update the hash table (
MsiFileHash
) or theFile
table for files with version information. - If you change merely some registry value, you should be fine without any of that ...
- If you exchange files, make sure to update the hash table (
- Now prepare a
.pcp
(Patch Creation Properties) file to point one row in theTargetImages
table to the.msi
in%BASEDIR%
and one row inUpgradedImages
to the.msi
in%UPDIR%
- Invoke
msimsp.exe <pcp-file> -p <absolute-path-to-desired-patch-file>
Voila, you're done.
Now whether this is worth it depends solely on you.
It's how I am doing it with the help of some scripts that run SQL queries on the MSI databases in order to query values or update them as needed. This works perfectly well and has been put into a GNU make file to build a whole bunch of MSIs, derived MSIs, patches and dummy patches (for testing).
The trick here is to patch the decompressed admin image and direct msimsp.exe
to create a patch between the unchanged and the changed version of the decompressed admin image. All in all fits your requirement of doing it "by hand".
Write a comment in case something needs clarification.
It is possible to create MSPs (patches) and MSTs (transforms) using Orca and the other tools from the Windows Install SDK (which is now part of the Windows SDK). However, the process may not be much easier than what you already have with WiX.
Here is the best explanation I could find with a few minutes of Googling; I still suspect there must be something better out there, though. But if you're familiar with the Windows Installer format, it's pretty easy to explore and try a few things with Orca until you have the hang of it.
精彩评论