Добавление внешнего CAB в MSI с внутренним

У меня есть установщик Visual Studio (vs2015), который устанавливает приложение. Я хочу, чтобы он также установил набор файлов конфигурации, содержимое которых зависит от места физической установки, которые будут доставлены в виде cab-файла в тот же каталог, что и msi. В кабине имеется известный набор файлов, которые будут распределены по 2 папкам в месте установки и создаются проектом, отличным от установщика. Как мне получить msi для установки как своего внутреннего содержимого, так и содержимого внешнего файла кабинета?

2 ответа

Решение

Wise Package Studio

Я фактически успешно обновил файлы MSI новыми файлами для установки с помощью Wise Package Studio. Он добавил CAB-файл в Cabs table (Я не знаю, является ли эта таблица на самом деле мудрым "представлением" или настоящей таблицей MSI - в Orca кажется, что все CAB встроены в MSI). Существует соответствующая запись в Media table где LastSequence значение (в таблице Media) описывает, какой CAB содержит какие файлы. В таблице файлов вы найдете поле с именем Sequence который определяет "порядок" файлов в списке. По сути ваши новые файлы будут в конце "заказа" и, следовательно, в новой CAB. Немного вовлечено все это.

Тем не менее, я успешно получил Wise Package Studio для встраивания нового CAB-файла и использования внешнего CAB-файла для установки новых файлов во время установки, но у меня нет документированной процедуры и я не вспоминаю все шаги. Более того, я не рекомендую процедуру - фактически я никогда не использовал бы этот подход сейчас. Это было просто использовано в месте, где я работал в то время. В большинстве случаев мы использовали преобразование, чтобы добавить этот контент в основной пакет, а не взламывать сам MSI.


MSI SDK: включение файла кабинета в установку

Процедура добавления CAB-файла в ваш MSI описана в MSI SDK здесь: Включение CAB- файла в установку. Весьма вовлечен - как я уже сказал, но определенно возможен. Как вы увидите отсутствие # Флаг в начале имени CAB в таблице Media указывает внешний файл CAB.

Итак, я полагаю, вкратце:

  1. Добавьте новую запись в таблицу файлов, установите порядковый номер равным +1 из самой высокой записи последовательности файлов, которая уже существует. Я хотел бы добавить новую, соответствующую запись в Component table также.
  2. Добавить новую строку в Media table укажите номер, который вы установили для файла в LastSequence колонка. Добавьте имя вашего кабинета в Cabinet, Убедитесь, что префикс имени CAB не префикс #,
  3. Wise также добавил бы записи в таблицу MsiFileHash. Не уверен, если это требуется или нет. Уверен, что добавлять записи здесь не обязательно.
  4. Как вы увидите в связанной статье MSI SDK, вы можете встроить всю кабину, выполнив несколько последних шагов, перечисленных в связанном содержимом MSDN.

Хотелось бы, чтобы у меня было время проверить все это, но я этого не делаю. Что подводит меня к следующему пункту:


По умолчанию / Создание ваших настроек?

Когда я вижу подобные вопросы, я всегда задаю себе вопрос: что находится в этих файлах? Являются ли они "тривиальными настройками", которые могут быть по умолчанию вместо жестко заданы в конфигурационных файлах? Это спасло мне много работы, много раз.

Развертывание настроек и файлов данных всегда было проблематичным как с MSI, так и с установщиками устаревшего стиля. Моя философия развертывания таких файлов заключается в том, чтобы относиться к тому, что вы устанавливаете, как к "только для чтения", а затем вы копируете их в местоположения для каждого пользователя или устанавливаете их в HKCU при запуске приложения, используя некоторый нормальный процесс получения соответствующих значений (из написанных настроек HKLM во время установки, извлекается из пользователя, извлекается из Интернета и т. д.). Пожалуйста, посмотрите этот более длинный ответ по теме: Создайте папку и файл в профиле текущего пользователя из профиля администратора. На мой взгляд, лучшим подходом является получение настроек при запуске из онлайновой базы данных (как вы увидите, если прочтете связанный контент), но это необходимо.

Непонятно, что именно вы имеете в виду, но вы не можете изменить MSI, чтобы распаковать все файлы в вашей отдельной CAB, как если бы они были в MSI, как и другие файлы. В файлах MSI, в таблице файлов, в таблице компонентов и т. Д. Содержится слишком много внутренних данных.

Поэтому, если CAB-файл находится в том же месте, что и MSI-файл, вы можете создать настраиваемое действие, скопировать его в целевую систему и распаковать, если хотите. Копию можно узнать, где находится местоположение MSI, используя свойство [SourceDir] или свойство [OriginalDatabase]. Свойство OriginalDatabase

Вы проанализируете это местоположение, чтобы получить путь, а затем сделаете копию в местоположение TARGETDIR.

Другие вопросы по тегам