Работа с потерянными компонентами при компоновке wixlib

Мне поручено создать 2 установщика на основе одной и той же библиотеки wixlib, предоставленной третьей стороной. Полный установщик включает в себя все компоненты, Lite только основные. Я предполагаю, что wixlib имеет следующую структуру:

<Fragment>
  <ComponentGroup Id="CoreStuff">
    <!-- List of components for this bit, roughly 5MB -->
  </ComponentGroup>
</Fragment>
<Fragment>
  <ComponentGroup Id="ExtraStuff">
    <!-- List of components for this bit, roughly 45MB -->
    <ComponentRef Id="BigFile1"/>
  </ComponentGroup>
  <Component Id="BigFile1">
    <File Id="BigFile1_bin" Name="BigFile1.bin"/>
  </Component>
</Fragment>

Установщик встроен в msbuild. Компоненты включаются в проект следующим образом:

<Feature Id="ThirdPartyStuff">
  <ComponentGroupRef Id="CoreStuff"/>
  <?if $(var.Configuration) = "Full"?>
  <ComponentGroupRef Id="ExtraStuff"/>
  <?endif?>
</Feature>

В итоге, как и ожидалось, получаю ошибку LGHT0267:

ошибка LGHT0267: найден потерянный компонент «BigFile1». Если это продукт, каждый компонент должен иметь хотя бы одну родительскую функцию. Чтобы включить компонент в модуль, вы должны включить его непосредственно как элемент компонента элемента модуля или косвенно через элементы ComponentRef, ComponentGroup или ComponentGroupRef.

Кто-нибудь придумал обходной путь, как выборочно использовать компоненты, представленные в wixlib? Я мог бы включить ExtraStuff как отдельную функцию для пользователя, но здесь цель состоит в том, чтобы уменьшить размер установщика. Я мог бы вежливо попросить ThirdParty предоставить два отдельных wixlib, но я бы хотел этого избежать.


person Mario Barcz    schedule 08.04.2015    source источник


Ответы (2)


Я не думаю, что wix может использовать только часть пакета wixlib. Думайте о wixlibs как о модулях слияния (без просматриваемых таблиц). Вы не можете использовать только половину модуля слияния, и вы не можете использовать только половину wixlib.

Боюсь, вам придется попросить третью сторону разбить их wixlib на два пакета.

person jbudreau    schedule 08.04.2015

После борьбы у меня есть обходной путь, неприятный обходной путь:

  1. Создайте фиктивный wixproject и включите wixlib, как обычно.
  2. Добавьте фиктивный проект в качестве зависимости для окончательного проекта.
  3. In post-build event of dummy project set powershell script to run, which will:
    • De-compile dummy.msi with binaries output (switch -x) using dark.exe
    • Создайте файл new.wxs на основе dummy.wxs с включением тегов, чтобы сделать компоненты условными
  4. Включите new.wxs в окончательный проект
person Mario Barcz    schedule 15.04.2015