2013-06-25 3 views
2

У меня есть основное приложение TheApp, которое поддерживает плагины. Приложение A устанавливается по умолчанию на $(ProgramFiles)\TheApp, но владельцы золота хотят, чтобы это было настраиваемым пользователем, поэтому его местоположение может меняться в зависимости от ввода пользователя во время установки.Как расширение установщика MSI может найти каталог установки другого приложения?

Плагины устанавливаются путем копирования их в подкаталог Packages в каталоге установки. В частности, не нужно устанавливать параметры реестра для загрузки пакета, и я стараюсь как можно больше не вмешиваться в реестр. Естественно, если пользователь изменил каталог установки при установке TheApp, плагины также должны изменить место их установки для соответствия.

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

Есть ли «лучшая практика» для того, как это сделать, между установкой связи, в частности, с каталогом установки? Как будет выглядеть сообщение, учитывая, что оба установщика будут записаны в WiX?

ответ

3

Да, вы можете использовать базу данных установщика Windows и, при определенных условиях, без специального действия!

Стандартные таблицы и действия поддерживают поиск установленных компонентов. Итак, если в вашем каталоге приложений установлен определенный компонент (например, ваше приложение .exe), в котором вы указали фиксированный GUID, ваш установщик плагинов может его найти.

Поскольку во всех проектах вам понадобится «MainComponentGuid», извлеките его как define в файл Include.

Плагин авторинга:

<?include ../MainSetup/MainComponentGuid.wxi?> 

<Property Id="MAINDIR"> 
    <ComponentSearch Id="MainComponentSearch" Type="file" Guid="$(var.MainComponentGuid)"> 
    <DirectorySearch Id="MainComponentDirectorySearch" AssignToProperty="yes" Depth="0" /> 
    </ComponentSearch> 
</Property> 

<CustomAction Id="SetInstallFolder" Directory="INSTALLFOLDER" Value="[MAINDIR]" /> 
<InstallExecuteSequence> 
    <Custom Action="SetInstallFolder" After="CostFinalize">NOT Installed</Custom> 
</InstallExecuteSequence> 

В вашей структуре каталога, вы бы сделать Packages дитя INSTALLFOLDER. Вы также можете использовать MAINDIR в LaunchCondition, чтобы предотвратить установку плагина, если не установлен основной продукт.

+0

Спасибо Том: это была информация, которую я искал. Я особенно ценю образец кода. Это дает мне хорошую отправную точку для моей реализации. –

1

Написание ключа реестра во время установки, а затем поиск его довольно simple using WIX.

Вы можете использовать следующие действия для создания ключа:

<Component Id="RegistryEntries" Guid="PUT-GUID-HERE"> 
    <RegistryKey Root="HKCU" 
       Key="Software\MyApplicationName" 
      Action="createAndRemoveOnUninstall"> 
    <RegistryValue Action="write" Name="InstallDir" Type="string" Value="[INSTALLDIR]" /> 
    </RegistryKey> 
</Component> 

Здесь InstallDir это свойство WIX, где выбранный пользователем целевой путь вашего программного обеспечения устанавливается. После того как вы этот ключ установки, то вы можете посмотреть на это в установщиком плагинов (предполагая, что есть отдельный инсталлятор для плагинов), используя следующий пример:

<Property Id="AnyNameYouLike"> 
<RegistrySearch Id="YourRegistrySearchId" 
       Root="HKCU" 
       Key="Software\MyApplicationName" 
       Name="InstallDir" 
       Type="raw" /> 
</Property> 

Этот код установит значение свойства AnyNameYouLike к путь хранится в InstallDir. Вы можете поместить этот код где-нибудь, прежде чем намереваться использовать этот путь.

В качестве альтернативы вы можете создать файл в окнах ProgramData\YourApp или в папке Users, чтобы сохранить место установки, если вы действительно хотите избежать записи реестра.

0

1) Проверьте, если ваш главный продукт пишет ключ INSTALLLOCATION в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \

2) Если нет такого ключа, установите ARPINSTALLLOCATION property

3) Если ключ был написан основным продуктом - просто прочитайте это значение с помощью RegistryLocator и установите TARGETDIR.

+0

Хорошая идея использовать запись в реестре, которая уже входит в состав установщика. Но это потребует знания ProductCode основного продукта в момент написания установщика плагина. Он может меняться от версии к версии, поэтому более старый плагин не сможет найти более новую версию основной программы. –

+0

Ну, вы должны знать, по крайней мере, UpgradeCode основного продукта. Потому что вам нужно проверить, установлен ли основной продукт alrerady :) Если это так, вы можете получить ProductCode через действие UpgradeTable и UseReleatedProducts. Таким образом, вы сможете отформатировать правильный путь к реестру. – Vadim