Работа с потерянными компонентами при компоновке 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'. Если это продукт, каждый компонент должен иметь хотя бы одну родительскую функцию. Чтобы включить Компонент в Модуль, вы должны включить его непосредственно как элемент Component элемента Module или косвенно через элементы ComponentRef, ComponentGroup или ComponentGroupRef.
Кто-нибудь придумал способ, как избирательно использовать компоненты, предоставляемые в wixlib? Я мог бы включить ExtraStuff
как отдельная функция для пользователя, но цель здесь - уменьшить установщик. Я мог бы вежливо попросить ThirdParty предоставить два отдельных wixlib, но я бы хотел этого избежать.
2 ответа
После борьбы у меня есть обходной путь, неприятный обходной путь:
- Создайте фиктивный wixproject и включите wixlib, как вы это обычно делаете.
- Добавьте фиктивный проект как свою зависимость для окончательного проекта
- В событии пост-сборки фиктивного проекта запустите скрипт powershell, который будет:
- Декомпилируйте dummy.msi с выводом двоичных файлов (ключ -x), используя dark.exe
- Создание файла new.wxs на основе dummy.wxs с включением тегов, чтобы сделать компоненты условными
- Включить new.wxs в окончательный проект
Я не думаю, что у wix есть возможность использовать только часть пакета wixlib. Думайте о wixlibs как о модулях слияния (без видимых таблиц). Вы не можете использовать только половину модуля слияния, и вы не можете использовать только половину wixlib.
Боюсь, вам придется попросить третью сторону разбить их wixlib на два пакета.