Зависимости модуля слияния WiX - PullRequest
0 голосов
/ 03 ноября 2011

У меня проблема с некоторыми существующими установщиками, которые я повторил в простом тестовом примере:

  • Installer1 устанавливает App1 и LibraryA (v1).
  • Installer2 устанавливает App2, LibraryA (v2) и LibraryB. Для LibraryA (v2) требуется LibraryB, поэтому LibraryB теперь установлена. Библиотека A (v1) не имела такой зависимости. LibraryA (v2) должен перезаписать LibraryA (v1).
  • Если я запускаю Installer1, затем Installer2, затем удаляю Installer2, LibraryB удаляется, но LibraryA остается на v2 (разумно - я не ожидаю, что он вернется к предыдущей версии).

Забыв о существующей проблеме и представьте, что я начинал с нуля, как бы вы предложили мне создать свой проект WiX, чтобы справиться с такой ситуацией? В моем случае все библиотеки определены как модули слияния - что-то, что я не могу изменить (wixlibs исключены).

Я пытался, но безрезультатно, использовать элемент Dependency для создания зависимости между модулем слияния LibraryA (v2) и модулем слияния LibraryB - кажется, просто выдается предупреждение компоновщика, если я забуду сослаться на LibraryB в Установщик, а не создание фактической зависимости.

Скрипты .wxs в моем тестовом примере выглядят примерно так (все они устанавливаются в одну папку для простоты тестирования):

LibraryA (v1) .wxs:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="MergeRedirectFolder">
        <Component Id="LibraryAComponent" Guid="d98dd742-c3d3-4aee-8d84-87f2b3c837dc">
            <File Source="v1\LibraryA.dll" />
        </Component>
    </Directory>
</Directory>

LibraryA (v2) .wxs:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="MergeRedirectFolder">
        <Component Id="LibraryAComponent" Guid="d98dd742-c3d3-4aee-8d84-87f2b3c837dc">
            <File Source="v2\LibraryA.dll" />
        </Component>
    </Directory>
</Directory>

<Dependency RequiredId="LibraryBMergeModule.DD524F28_EAE0_47B8_A895_3AF2F7A7361A" RequiredLanguage="1033"/>

LibraryB.wxs:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="MergeRedirectFolder">
        <Component Id="LibraryBComponent" Guid="46e6e0da-2a99-4f0d-bed2-e764e16b9eed">
            <File Source="LibraryB.dll" />
        </Component>
    </Directory>
</Directory>

App1.wxs:

<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

<Directory Id="TARGETDIR" DiskId="1" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="WiXTest" Name="WiXTest">
            <Merge Id="LibraryAv1" Language="1033" SourceFile="LibraryAv1.msm" />

            <Component Id="App1Component" Guid="93D11AFF-5307-4355-B261-0096775B6A89">
                <File Source="App1.exe" />
            </Component>
        </Directory>
    </Directory>
</Directory>

<Feature Id="Libraries" Title="Shared Files" Level="1">
    <MergeRef Id="LibraryAv1" />
</Feature>

<Feature Id="App" Title="Application" Level="1">
    <ComponentRef Id="App1Component" />
</Feature>

App2.wxs:

<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

<Directory Id="TARGETDIR" DiskId="1" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="WiXTest" Name="WiXTest">
            <Merge Id="LibraryB"   Language="1033" SourceFile="LibraryB.msm" />
            <Merge Id="LibraryAv2" Language="1033" SourceFile="LibraryAv2.msm" />

            <Component Id="App2Component" Guid="173C71B6-E403-4AC1-894D-06799C6782A4">
                <File Source="App2.exe" />
            </Component>
        </Directory>
    </Directory>
</Directory>

<Feature Id="Libraries" Title="Shared Files" Level="1">
    <MergeRef Id="LibraryB" />
    <MergeRef Id="LibraryAv2" />
</Feature>

<Feature Id="App" Title="Application" Level="1">
    <ComponentRef Id="App2Component" />
</Feature>

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

1 Ответ

0 голосов
/ 03 ноября 2011

Я не эксперт по WIX, но да, для MSI вам нужен хотя бы доктор наук. Сначала вы должны знать правила о компонентах MSI:

Из мучительного опыта я знаю, что если несколько MSI вводят одни и те же компоненты, это нехорошо. Если возможно, я бы стремился к принципу единого источника, чтобы ваши библиотеки всегда устанавливались одним и тем же MSI (пусть это будет инфраструктурный MSI). Затем MSI вашего приложения просто проверяет, установлена ​​ли инфраструктура, и все.

Возвращаясь к вашему вопросу, что вы должны делать с вашими модулями слияния. Я хотел бы создать для каждого модуля слияния дополнительные сообщения MSI (да, клиентам не нравятся переполненные каталоги установленного программного обеспечения), чтобы быть уверенным, что если вам нужно обслуживать библиотеки, у вас есть полная свобода.

Я не знаю вашу структуру программного обеспечения, но, возможно, вам понадобятся LibraryA v1 и v2 одновременно, поэтому вам следует подумать о развертывании ваших библиотек в кэше WinSxS или, если они управляются GAC. Или вы придумываете что-то похожее в структуре папок или в соглашении об именах файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...