четверг, 24 февраля 2011 г.

Обновление файлов в msi


Иногда заказник хочет странных вещей, например послать клиенту предыдущую версию приложения, обновив в MSI лишь несколько библиотек, при этом не пересобирать весь MSI.
Связано это стем что для обновления посылалось именно эти сборки, а не новый MSI.
Пересобрать все нельзя потому что исходники не актуальны, а откат не возможен из-за неправильного процесса разработки.

Итак обновление:
  1. Открыть MSI с помощью ORCA
  2. Запомнить Cabinet Id из таблицы MEDIA, это Id cab файла в котором лежат файлы.
  3. В таблице File зпомнить File Id нужно файла
  4. Достать cab файл из MSI: "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MsiDb.Exe" -d msiName.msi -x "_6B1C2906BF2562A8192CB0382D711877"
  5. Переименовать _6B1C2906BF2562A8192CB0382D711877 в *.cab
  6. Распаковать cab, например с помощью 7z
  7. В качестве имен файлов там используются Id, найти  свой файл и обновить его
  8. Запаковать 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
  9. Переименовать cab в Cabinet Id  ("_6B1C2906BF2562A8192CB0382D711877")
  10. Запаковать это в 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"
Если создать на все это батники, то будет довольно быстро.
Минусы: размер файлов не обновляется в таблице, но все вроде работает.

1 комментарий: