WiX - установить каталог модуля слияния во время установки?

Я создал модуль слияния, следуя инструкциям в руководстве по началу работы с Wix, которое находится по адресу: http://wix.sourceforge.net/manual-wix2/authoring_merge_modules.htm.

Вот модуль слияния wxs:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="SomeRepositoryMergeModule" Language="1033" Version="1.0.0.0">
    <Package Id="f11e7321-a687-4d53-8be7-21a8ae0721a6" Manufacturer="SomeCompany Technologies" InstallerVersion="200" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
          <Directory Id="MODULEINSTALLLOCATION" Name="Some Repository">
            <Component Id="ServicesHostWindowsService" Guid="257D1FAE-4AFF-4155-BDB8-D81F50E5862B">
              <File Id="ServicesHostInstallerExecutable" KeyPath="yes" DiskId="1" Name="WindowsServiceHost.exe" Source="..\WindowsServiceHost\bin\Output_For_Installer\WindowsServiceHost.exe" />
              <File Id="ServicesHostConfig" KeyPath="no" DiskId="1" Name="WindowsServiceHost.exe.config" Source="..\WindowsServiceHost\bin\Output_For_Installer\WindowsServiceHost.exe.config" />
              <File Id="SomeCompanyCommon" KeyPath="no" DiskId="1" Name="SomeCompany.Common.dll" Source="..\WindowsServiceHost\bin\Output_For_Installer\SomeCompany.Common.dll" />
              <File Id="SomeRepositorySqlScript" KeyPath="no" DiskId="1" Name="SomeRepository.sql" Source="..\..\..\..\..\DB\SomeRepository\SomeRepository.sql" />
              <File Id="LogConfigXml" KeyPath="no" DiskId="1" Name="log.config.xml" Source="..\WindowsService\log.config.xml" />
              <ServiceInstall Id="ServicesHostInstallElement" ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes"
                              Name="AServer WindowsService Host"
                              Description="The windows service responsible for hosting SomeCompany Some Repository's WindowsService."
                                                    />
              <ServiceControl Id="ServicesHostController" Name="AServer WindowsService Host" Remove="uninstall" Start="install" Stop="uninstall" Wait="no" />
            </Component>
          </Directory>
      </Directory>
    </Directory>
    <ComponentGroupRef Id="Product.Generated" /><!-- Harvested by heat -->
  </Module>  
</Wix>

А вот и основной продукт wxs:

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

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="SomeCompanyGlobalDir" Name="SomeCompany Technologies">
      <Directory Id="INSTALLLOCATION" Name="Some Repository">
        <Merge Id='SomeRepositoryPrimaryModule' Language='1033' SourceFile='..\SomeRepositoryMergeModule\bin\Output_For_Installer\SomeRepositoryMergeModule.msm' DiskId='1' />          
      </Directory>
    </Directory>
  </Directory>
</Directory>

<Feature Id="ProductFeature" Title="SomeRepositoryStandaloneInstaller" Level="1">           
  <!-- Note: The following ComponentGroupRef is required to pull in generated authoring from project references. -->            
  <MergeRef Id="SomeRepositoryPrimaryModule"/>
</Feature>

<UIRef Id="WixUI_InstallDir" />
<UIRef Id="WixUI_ErrorProgressText" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />

Когда я создаю установщик и запускаю его, файлы из модуля слияния не попадают в каталог, выбранный пользователем из пользовательского интерфейса установщика. Несмотря ни на что, они попадают в каталог «[Program Files] \ SomeCompany Technologies \ Some Repository \».

Если я удалю ссылку на Program Files из пути к каталогу модуля слияния и использую корневой каталог с именем "." чтобы выбрать родительский каталог родительского MSI, тогда модуль слияния отлично подберет выбранный пользователем каталог. Но затем Visual Studio выдает ошибку при сборке, что сбор не будет работать, потому что путь должен быть основан на одном из стандартных каталогов, чтобы использовать автоматически сгенерированные Guids.

Итак, как я могу заставить модуль слияния взять каталог, выбранный пользователем во время установки, при этом сохраняя путь к модулю слияния в стандартном каталоге?


person Ayo I    schedule 24.05.2012    source источник
comment
Кстати, я попытался добавить ConfigurableDirectory в тег Feature со значением INSTALLLOCATION, но он все еще не выбирает каталог ...   -  person Ayo I    schedule 24.05.2012


Ответы (1)


Вы сбиваете с толку MSI, потому что ProgramFilesFolder - это зарезервированное имя свойства. Измените это значение на «MergeRedirectFolder», и благодаря элементу Merge в элементе Directory с идентификатором INSTALLLOCATION MergeRedirectFolder станет связанным с INSTALLLOCATION. Каталог Some Repository ([MODULEINSTALLLOCATION]) будет тогда подкаталогом INSTALLLOCATION.

Также не стесняйтесь проверить проект ISWIX на CodePlex. Он полезен для создания и поддержки модулей слияния и имеет образец исходного кода, относящийся к тому, что вы здесь пытаетесь сделать.

person Christopher Painter    schedule 24.05.2012
comment
Благодарю за ваш ответ! Итак, вот в чем проблема. Я использую интеграцию сбора тепла в Visual Studio. Когда я удаляю ProgramFilesFolder и заменяю его MergeRedirectFolder, я получаю следующие ошибки: Компонент cmpFBB3C43EFF7EC66E72A4BA7150FEFCD0 имеет ключевой файл с путем 'TARGETDIR \ some_path \ some_file.ext'. Поскольку этот путь не находится в одном из стандартных каталогов (например, ProgramFilesFolder), этот компонент не соответствует критериям наличия автоматически сгенерированного guid. Как я могу и то, и другое: внести изменения и продолжать использовать встроенную сборку урожая? - person Ayo I; 02.06.2012
comment
Ничто в этом вопросе не имеет отношения к сбору урожая. - person Christopher Painter; 02.06.2012
comment
Истинный. Но я не могу применить ваше предыдущее решение из-за проблемы со сбором урожая. Я пытался проверить ваше решение и не смог, потому что Visual Studio / heat, похоже, считает, что замена ProgramFilesFolder на MergeRedirectFolder теперь оставляет компонент без рутинга в стандартном каталоге. - person Ayo I; 02.06.2012
comment
Приведенный выше ответ касается сопоставления каталога установки во время установки. Однако для тех, кто пытается использовать встроенный сбор данных Visual Studio, это решение может не подойти. Я могу задать дополнительный вопрос, чтобы попытаться решить эту половину проблемы. - person Ayo I; 06.06.2012
comment
FWIW, я категорически против сбора урожая. Есть очень много вещей, которые могут пойти не так, как надо, когда вы попросите компьютер выяснить ваши зависимости и создать их для вас во время сборки, а не делать это самостоятельно, зная, что это изменится только тогда, когда вы этого захотите. - person Christopher Painter; 06.06.2012
comment
Спасибо. Отличный ответ, который был именно тем, что мне было нужно. - person Tom Beech; 26.03.2015
comment
@ user497745 Вы когда-нибудь в этом разбирались? Хотя я не собираю урожай, но сталкиваюсь с той же проблемой, которую вы описываете в комментариях. - person sirdank; 22.12.2015
comment
Я до сих пор не пользовался сбором урожая, но, возможно, это поможет. Мне пришлось добавить ComponentGuidGenerationSeed="{GUID-GOES-HERE}" к элементу <Directory> верхнего уровня. Я уверен, что мне все равно придется изменить это во время основного обновления, но изменение одного guid лучше, чем изменение 1000, потому что я вручную жестко запрограммировал каждый компонент, чтобы он был уникальным. - person sirdank; 17.02.2016