WiX: Как предотвратить добавление нескольких копий связанного файла в MSI?

У меня есть установщик, который связывает файл wixlib. Wixlib устанавливает исполняемый файл в несколько каталогов.

Когда я включаю «Привязать файлы к файлу библиотеки» для wixlib (используя переключатель -bf), lit.exe добавляет исполняемый файл в wixlib. Однако, когда я связываю wixlib в MSI, исполняемый файл добавляется несколько раз в файл MSI, увеличивая размер установщика.

Когда я выключаю «Привязать файлы к файлу библиотеки», проблемы не возникает (но, очевидно, мне нужно настроить проект установщика WiX, чтобы знать, где найти исполняемый файл, а не искать внутри wixlib).

С переключателем -bf и без него окончательные файлы MSI выглядят одинаково при просмотре с использованием orca, поэтому я изо всех сил пытаюсь понять, почему MSI в первом случае необходимо включать несколько копий.

Файл wixlib wxs выглядит так:

<Fragment>

<ComponentGroup Id="cmpFoo1">
  <ComponentRef Id="cmpFooExe1" />
</ComponentGroup>

<DirectoryRef Id="TARGET_PATH1">
  <Component Id="cmpFooExe1" Guid="*">
    <File Id="filFooExe1" Name="foo.exe" KeyPath="yes" Source="$(var.source_path)\foo.exe" />
  </Component>
</DirectoryRef>

<ComponentGroup Id="cmpFoo2">
  <ComponentRef Id="cmpFooExe2" />
</ComponentGroup>

<DirectoryRef Id="TARGET_PATH2">
  <Component Id="cmpFooExe2" Guid="*">
    <File Id="filFooExe2" Name="foo.exe" KeyPath="yes" Source="$(var.source_path)\foo.exe" />
  </Component>
</DirectoryRef>

<Feature Id="ftFooFeatures" Level="1">
 <ComponentGroupRef Id="cmpFoo1"/>
 <ComponentGroupRef Id="cmpFoo2"/>
</Feature>

</Fragment>

И файл установщика wxs, например:

<Product Id="MyProduct" Name="ProductName" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="{UpgradeCode_Guid}">
<!-- ...etc... -->

<Directory Id="ROOT_TARGET_PATH" Name="Foo">
  <Directory Id="TARGET_PATH1" Name="Foo1" ComponentGuidGenerationSeed="{Guid1}" />
  <Directory Id="TARGET_PATH2" Name="Foo2" ComponentGuidGenerationSeed="{Guid2}" />
</Directory>

<Feature Id="ftMain" Level="1">
  <FeatureRef Id="ftFooFeatures" />
</Feature>

<!-- ...etc... -->
</Product>

Ожидается, что окончательный список установки будет примерно таким: c: \ foo \ foo1 \ foo.exe c: 'foo \ foo2 \ foo.exe

Есть ли способ предотвратить добавление WiX (предположительно компоновщика?) Нескольких копий foo.exe в окончательный файл MSI, при этом все еще связывая foo.exe с wixlib?


person Phil Young    schedule 18.01.2011    source источник


Ответы (2)


WiX имеет функцию под названием Smart Cabbing . Предполагается, что WiX автоматически сделает это за вас при условии, что элементы файла имеют одинаковый атрибут исходного пути.

Об этом уже спрашивали в StackOverflow, но рано утром его искать. :-) Вы, вероятно, захотите поискать и найти его, потому что я помню, что вопрос был примерно в строке «У меня такой же исходный путь, почему он не работает» Роб Меншинг вмешался в тему, но я не помню какое было разрешение.

person Christopher Painter    schedule 18.01.2011
comment
Я кое-что прочитал, в том числе пост Роба об Smart Cabbing и Wixlibs по адресу robmensching.com/blog/posts/2008/10/10/. Я немного запутался в том, что делает lit.exe, когда связывает файлы. Сообщение о wixlibs предполагает, что файлы кабинета добавляются к двоичным библиотекам, но я вижу, когда установщик строит с параметром embedcab, установленным на false, что установщик создает свой собственный файл cab. Зачем свету создавать собственный файл CAB? Я бы предположил, что он взял тот из wixlib. (или это глупое предположение - я немного новичок в wix!). - person Phil Young; 19.01.2011
comment
Обновление - читая журнал изменений для WiX 3.5, я заметил, что WixBuild: версия 3.5.0619.0 Smart cabbing теперь вылавливает ВСЕ повторяющиеся файлы, а не только те, которые находятся в том же исходном пути (на основе хешей файлов). Я обновился до WiX 3.5, и проблема решена. Теперь мне интересно, было ли это просто ошибкой в ​​WiX 3.0, или изменение поведения в 3.5 произошло в пользу того, как я разработал свой проект wix. Это также очень похоже на следующий вопрос: stackoverflow.com/questions/3588066/ - person Phil Young; 19.01.2011
comment
Разумнее делать это на основе хеширования. - person Christopher Painter; 19.01.2011

Лучшее, что я могу придумать, чтобы избежать добавления нескольких копий .exe в установщик, - это использовать CopyFile.

Если вы планируете копировать не только файлы, которые вы устанавливаете, но и другие файлы, имеющиеся на целевом ПК, не забудьте включить RemoveFile, поскольку такие файлы не удаляются установщиком Windows при удалении.

person Daniel Morritt    schedule 18.01.2011