У меня проблема с некоторыми существующими установщиками, которые я повторил в простом тестовом примере:
- 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.