Иногда заказник хочет странных вещей, например послать клиенту предыдущую версию приложения, обновив в MSI лишь несколько библиотек, при этом не пересобирать весь MSI.
Связано это стем что для обновления посылалось именно эти сборки, а не новый MSI.
Пересобрать все нельзя потому что исходники не актуальны, а откат не возможен из-за неправильного процесса разработки.
Итак обновление:
- Открыть MSI с помощью ORCA
- Запомнить Cabinet Id из таблицы MEDIA, это Id cab файла в котором лежат файлы.
- В таблице File зпомнить File Id нужно файла
- Достать cab файл из MSI: "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MsiDb.Exe" -d msiName.msi -x "_6B1C2906BF2562A8192CB0382D711877"
- Переименовать _6B1C2906BF2562A8192CB0382D711877 в *.cab
- Распаковать cab, например с помощью 7z
- В качестве имен файлов там используются Id, найти свой файл и обновить его
- Запаковать cab:MakeCAB.ddf :.OPTION Explicit
.Set DiskDirectoryTemplate=CDROM
.Set CompressionType=MSZIP
.Set UniqueFiles=Off
.Set Cabinet=On
.Set MaxDiskSize=CDROM
;******************************************
_21167989434C2FB0A2AAF37341B48FE4
_22D916C2425750D2242B53C82C13E7A4
_25E9BCFDE1831D1D2B622AE0ADEEA789
_274295E7C8E0ECD4FC19D38017ABD787"MAKECAB.EXE" /F MakeCab.ddf /D CabinetNameTemplate=data.cab - Переименовать cab в Cabinet Id ("_6B1C2906BF2562A8192CB0382D711877")
- Запаковать это в MSI:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MsiDb.Exe" -d msiName.msi -k "_6B1C2906BF2562A8192CB0382D711877""C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MsiDb.Exe" -d msiName.msi -a "_6B1C2906BF2562A8192CB0382D711877"
Если создать на все это батники, то будет довольно быстро.
Минусы: размер файлов не обновляется в таблице, но все вроде работает.
Возможно InstallShield, Wise или AdminStudi могли бы помочь
ОтветитьУдалить