Я вижу, что существует множество разных способов, как сделать так, чтобы установочный пакет установил ярлык. Одним из них является использование значения реестра в качестве ключевого пути для компонента, который в основном содержит ярлык:
<Component Id="cmpShortcut1">
<RegistryValue Root="HKMU" Key="Software\Acme Inc\Foobar" Name="shortcut1" Type="integer" Value="1" />
<Shortcut Directory="ProgramMenuFolder" Id="shortcut1" Name="Foobar" Target="[#filFoobarExe]" />
</Component>
Это то, что, как я вижу, делают большинство авторов пакетов. Я интерпретирую это так, как время жизни компонента ярлыка связано со временем жизни соответствующего значения реестра. Это правильная интерпретация? Это хорошая практика? Я мог бы удалить файл ярлыка с того места, где он был установлен, и если попытка установки исправить, простое присутствие значения «ярлык1» в реестре приведет к процедуре восстановления до go переустановки ярлыка, поскольку он считает, что он все еще установлен (что он знает, ища и находя значение реестра). Это не очень хорошо, не так ли?
Глубже копаясь во Windows Внутренних компонентах установщика, в частности в таблицах, которые он использует, и находя соответствующие элементы, аргументы и отношения в Wix, я также могу определить компонент ярлыка следующим образом :
<Component Id="cmpFoobarExe">
<File Id="filFoobarExe" KeyPath="yes" Source="!(wix.SOURCEDIR)\mpc-hc64.exe">
<Shortcut Directory="ProgramMenuFolder" Id="shortcut1" Name="Foobar" />
</File>
</Component>
Теперь, насколько я понимаю, компонент теперь фактически привязан к самому файлу, а ярлык привязан к компоненту, в соответствии с документацией от Microsoft .
Приведенный выше вариант в дикой природе кажется гораздо более редким, чем первый подход, по-видимому, по той или иной причине.
Я должен добавить, возможно, очевидный момент, что два разных определения вызывают разные отношения в различных таблицах MSI.
Учитывая, как Windows Установщик, по-видимому, дает определенную степень свободы в отношении того, как осуществить установку ярлыков, каков консенсус в отношении того, как лучше всего это сделать - ярлыки были и остаются очень важными части любой установки, так что я думаю, можно надеяться, что это решенная проблема к настоящему времени? И в чем разница между этими подходами на практике, помимо тех последствий, которые мне уже удалось выделить?
Я не понимаю мудрости и логики c, стоящих за связыванием ярлыка со значением реестра в такой способ, где это даже не предпочтение - если значение в реестре могло бы быть осмысленно использовано для контроля или определения, должен ли ярлык быть установлен или должен быть установлен, это было бы что-то. Но как сейчас с WI, кажется, что это некая форма придатка, которая также является ограничением из-за того, как WI был разработан для работы с компонентами?
С другой стороны, второй подход не кажется предложить возможность установить целевой файл - исполняемый файл приложения, который обычно является обязательной функцией при любой установке, но без ярлыка. Это оба или нет? Это вряд ли замечательно - я бы хотел спроектировать пакет таким образом, чтобы установщики могли выбирать, например, хотят ли они ярлык на рабочем столе.