MSI: Как установить компонент, только если другой компонент не установлен - PullRequest
0 голосов
/ 29 апреля 2011

Мое приложение содержит дополнительный компонент с ярлыками, которые заменяют ярлыки, предоставляемые при установке по умолчанию. Я не могу понять, как заставить его устанавливать ярлыки по умолчанию, только если этот дополнительный компонент не установлен - или мне просто нужно дать им одно и то же имя и надеяться на лучшее? Это необходимо для работы через дерево выборочной установки, а также обычные кнопки.

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

Я использую InstallShield 2011 Professional.

EDIT: уточнить - У меня есть три компонента: основной, основной ярлык и дополнительный с ярлыком. Я просто не знаю, как проверить, был ли аддон один установлен / устанавливается таким образом, чтобы я мог поместить его в состояние для ярлыка main. Конечно, есть переменная для этого? Документация очень спартанская.

Ответы [ 3 ]

1 голос
/ 01 мая 2011

Если я правильно понял вопрос, MAIN.EXE получит ярлык, если не будет установлен MIDDLEMAN.EXE.В этом случае MIDDLEMAN.EXE получает ярлык.

Это странная проблема в том смысле, что наличие компонента меняет определение другого компонента.Тем не менее, это может быть сделано.Я бы сделал это, создав компонент для MIDDLEMAN.EXE и определив его ярлык.Создайте другой компонент для MAIN.EXE и не определяйте его ярлык.

Затем напишите настраиваемое действие, которое выполняется в последовательности выполнения в немедленном выполнении, которое выполняется после расчета стоимости файла.Пусть он проверит, не установлен ли MIDDLEMAN.EXE и не устанавливается ли он.Если это так, запишите временную строку в таблицу ShortCut, чтобы определить ShortCut для MAIN.EXE.

Оттуда вы можете позволить MSI обрабатывать все остальное без необходимости в отложенных пользовательских действиях для обработки обслуживания.Ярлык.

Тем не менее, я не могу не задаться вопросом, нельзя ли это упростить, изменив дизайн приложения.По сути, вы пытаетесь выполнить внедрение зависимостей на уровне EXE, и было бы проще сделать это на уровне DLL.Другими словами:

MAIN.EXE с ShortCut Optional DLL

MAIN.EXE всегда вызывается, но он будет вести себя иначе, когда присутствует Optional.DLL.

0 голосов
/ 30 апреля 2011

@ Стивен: Я не понимаю, как можно избежать использования функций, поскольку в GUI пользователю видны только функции, и, следовательно, он позволяет пользователю указать, что устанавливать?

Обычно я этого не делаю.Подобно этому решению, поскольку оно не проверяется в соответствии с внутренними контролерами согласованности для файлов MSI, но вы можете установить EXE в одном компоненте, а затем иметь два компонента, каждый из которых имеет свои ярлыки, которые вы считаете взаимоисключающими.Затем вы присоединяете настраиваемый компонент ярлыка к функции, которая запускает настраиваемые ярлыки для установки.Функция должна быть видимой в графическом интерфейсе.Ярлыки не должны рекламироваться, поскольку они находятся в компонентах без файлов.Вам может потребоваться установить переходный флаг для компонентов ярлыка, чтобы разрешить удаление / добавление нужного компонента для установок обслуживания.Временные компоненты повторно оценивают свои состояния компонентов во время установки для обслуживания, чтобы проверить, будут ли указанные для них условия вызывать удаление / добавление.

0 голосов
/ 30 апреля 2011

Предполагая, что компонент по умолчанию включен в установку, вы, вероятно, можете использовать условие компонента для своего «дополнительного» компонента.Затем вы можете убедиться, что этот дополнительный компонент установлен, только если другой компонент не установлен, то есть они становятся взаимоисключающими.Это позволит избежать путаницы с функциями, которые значительно усложнят ваш пользовательский диалог.

...