Правильный способ реализации сопутствующих файлов Wix?

В настоящее время мы обновляем наши скрипты сборки с 3.0 до 3.5 и попутно исправляем кучу старых ошибок ICE. Я прочитал ряд статей, но я немного сбит с толку относительно того, что обычно является лучшим подходом к использованию сопутствующих файлов.

Теперь, если предположить, что файл A.manifest является сопутствующим файлом для A.exe...

Изначально: наша старая сборка разбивает 2 файла на 2 компонента:

<Component Guid="*" Id="A.exe" SharedDllRefCount="yes">
    <File Id="..." KeyPath="yes" Source="A.exe"/>
</Component>
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes">
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>

Что вызывает ICE54: ПРЕДУПРЕЖДЕНИЕ. Компонент «A.exe.manifest» использует файл «A.exe.manifest» в качестве KeyPath, но версия файла предоставляется файлом «A.exe», поэтому я думаю, это явно неправильно.

1-й подход: поэтому я попытался добавить KeyPath=yes в каталог компаньона:

<Component .../>
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes" KeyPath="yes">
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>

Это подавляет предупреждение, но в Orca столбец KeyPath компонента отображается как пустой, поэтому я сомневаюсь, что это правильно?

2-й подход: затем я попытался объединить компоненты:

<Component Guid="*" Id="A.exe" SharedDllRefCount="yes"> <!-- GUID is wrong! -->
    <File Id="..." KeyPath="yes" Source="A.exe"/>
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>

Но похоже, что позволить WiX автоматически генерировать GUID здесь не получится. Но если бы я генерировал идентификаторы GUID вручную, каждый раз, когда мы собирали бы его, это нарушало бы правила компонентов при обновлении! На самом деле мы развертываем множество сопутствующих файлов, поэтому создание хэша каждого компонента и его постоянное хранение также может оказаться невозможным. То же самое для использования фиктивного ключа реестра для каждого сопутствующего файла.

TLDR: какой из двух подходов лучше всего подходит для WiX?


person Jerry Chong    schedule 25.10.2010    source источник


Ответы (1)


Мой вопрос будет заключаться в том, какую проблему вы пытаетесь решить при этом? В общем, если вы не очень хорошо разбираетесь в правилах компонентов и последствиях использования/неиспользования сопутствующих файлов для обслуживания, вам, вероятно, следует придерживаться соотношения компонент:файл 1:1, когда все файлы являются ключевыми файлами. Это не абсолютное правило, но оно оптимально на 95-99%.

Тем не менее, взгляните на атрибут KeyPath в элементе File и помните, что если компонент не имеет данных в столбце KeyPath MSI, это означает, что каталог компонентов является ключевым путем.

person Christopher Painter    schedule 26.10.2010
comment
Хм, я предположил, что обычно рекомендуется устанавливать неверсионные/неверсионируемые файлы в качестве файла-компаньона для DLL или EXE, чтобы во время обновления/удаления файлы-компаньоны добавлялись или удалялись правильно - это правда? Я также понимаю, что установщик Windows может работать с неверсированными файлами со временем модификации и MsiFileHash, но мы никогда не пробовали это раньше. Является ли функция достаточно надежной? - person Jerry Chong; 26.10.2010
comment
Да, это надежно. Это зависит от того, что вы хотите сделать с этим файлом. В качестве сопутствующего файла при обновлении ключевого файла обновляются все файлы. Поскольку это собственный ключевой файл, время его модификации определяет решение. Что, если пользователь/процесс изменит файл после его установки? Вы хотите, чтобы эти настройки были удалены во время следующего обновления, или вы хотите, чтобы они остались в покое и файл больше не копировался? - person Christopher Painter; 26.10.2010
comment
Ах, почти все эти файлы, за исключением нескольких, на самом деле установлены в Program Files и Common Files, поэтому они никогда не изменяются пользователем. При этом я думаю, что лучше просто сделать их собственным ключевым файлом, как вы предлагаете. 2. Но из правил управления версиями файлов, если неверсионный файл впоследствии модифицируется, он никогда не перезаписывается, поэтому, предполагая, что это его собственный ключевой файл, как мне заставить его сделать это? - person Jerry Chong; 27.10.2010
comment
Выполните поиск версии wix, лежащей. По сути, это хак, когда вы сообщаете MSI, что у вашего файла есть версия, хотя это не так. Это меняет поведение. InstallShield называет этот уровень файла всегда перезаписанным. Это позволяет обойти тот факт, что REINSTALLMODE amus/omus применяется только на уровне пакета. Другой способ - пойти по сопутствующему маршруту, чтобы при обновлении DLL обновлялся файл TXT. К сожалению, именно так устроен установщик Windows. Он пытается защитить пользовательские данные, но не понимает этого в таких вещах, как XML-файлы. - person Christopher Painter; 27.10.2010