изменить значение INSTALLFOLDER WiX

Я использую настраиваемый пользовательский интерфейс WiXUI_InstallDir для установки программного обеспечения. В диалоговом окне обзора мы можем выбрать даже C:\ в качестве каталога установки. Есть ли какой-либо способ, чтобы каждый раз, когда пользователь выбирал C:\, он автоматически добавлял в него имя папки? например Если программное обеспечение является программным обеспечением XYZ, то после перехода к C:\ и нажатия OK оно должно показать c:\XYZ в pathedit.


person DTdev    schedule 02.03.2014    source источник
comment
хотите ли вы это дополнение для каждого корневого каталога (C:\, D:\, E:\..etc), только для C:\ или для каждого выбранного каталога (т. е. должно ли быть добавлено программное обеспечение XYZ, даже если пользователь выбирает C:\ Файлы программы\XYZ?)   -  person mcy    schedule 02.03.2014
comment
На самом деле мой приоритет только для C:\, D:\ и т. д. Каталог установки по умолчанию - C:\Program Files\XYZ. Если пользователь выбирает любой корневой каталог, он должен добавить XYZ.   -  person DTdev    schedule 02.03.2014


Ответы (3)


У меня иногда были клиенты, которые просили об этом в течение года, и я всегда говорил им «нет». Это не стандартная практика установщика Windows. По сути, вы пытаетесь помешать идиотам выбрать плохой каталог. Это практически невозможно, так как есть много глупых мест, где они могут разместить программное обеспечение. Если вы действительно не очень доверяете своим пользователям, откажитесь от выбора и всегда переходите в папку [ProgramFilesFolder]Моя компания\Мой продукт.

person Christopher Painter    schedule 02.03.2014

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

Концепцию изменения каталога установки можно рассматривать как анти-шаблон или пережиток неудачного дизайна установщика много лет назад, когда места на диске было мало и люди устанавливали его повсюду. Установка программного обеспечения должна быть более стандартизированной, и, учитывая выбор, я блокирую установку в [ProgramFilesFolder]My Company\My Product, как предлагает Крис.

Бывают случаи, когда вы можете захотеть разрешить установку программного обеспечения на карту памяти или аналогичный носитель. В таких случаях лучше разрешить специальную установку, которая работает прямо с флешки — другими словами, это автономное приложение без зависимостей от реестра. Немногие установщики приложений поддерживают это - последний, который я видел, был Opera несколько версий назад. Совершенно другая концепция, но более значимая, чем разрешить нестандартную установку, просто изменив путь установки.

person Stein Åsmul    schedule 02.03.2014
comment
Распространение небольших SSD-дисков сделало эту перспективу немного более сложной, чем раньше, но мне по-прежнему не нравятся нестандартные места установки. Я бы предпочел общесистемное объявление другого (дополнительного) места установки. Имейте в виду, что это может сломаться, если вы извлечете дополнительный диск, содержащий новое дополнительное местоположение. Нет простых исправлений. Некоторые советы по освобождению места на SSD: короткая версия, длинная версия. - person Stein Åsmul; 16.02.2019

Несмотря на то, что я согласен с тем, что программное обеспечение должно быть установлено в Program Files, я пишу код, который действует так, как вы описали. В этом коде, если пользователь выберет C:\, он будет установлен в C:\Program Files\XYZ. Если выбрана другая корневая папка, она будет установлена, скажем, в D:\XYZ. Вы можете расширить этот код, если хотите.

Допустим, у вас есть структура каталогов как

<Directory Id="TARGETDIR" Name="SOURCEDIR">
<Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION" Name="XYZ" />
</Directory>
</Directory>

В коде используется PathEdit элемент управления пользовательского интерфейса.

<Control
Id="customPathEdit"
Type="PathEdit"
Property="TARGETDIR"
Fixed="Yes"
Remote="Yes"
X="10"
Y="10"
Width="100"
Height="17">

<Publish
    Property="INSTALLLOCATION"
    Value="[ProgramFilesFolder]XYZ\"
    Order="1"
    <![CDATA[TARGETDIR << %SYSTEMDRIVE]]>
</Publish>

<Publish
    Property="INSTALLLOCATION"
    Value="[TARGETDIR]XYZ\"
    Order="2"
    <![CDATA[NOT (TARGETDIR << %SYSTEMDRIVE)]]>
</Publish>


</Control>

Конечно, нам нужен элемент управления PushButton, чтобы сообщить установщику, что путь изменился:

<Control
Id="OkButton"
Type="PushButton"
Height="17"
Width="56"
x="50"
Y="70"
Text="OK">

    <Publish
    Event="SetTargetPath"
    Value="INSTALLLOCATION"
    Order="1">1</Publish>

            <!--Another publish element is required to go to the next dialog-->
</Control>

Первый элемент публикации устанавливает для свойства INSTALLLOCATION путь [ProgramFilesFolder]XYZ\ только в том случае, если пользователь выбрал %SYSTEMDRIVE. Второй элемент публикации используется только в том случае, если пользователь не выбрал %SYSTEMDRIVE. Последний элемент публикации вызывает событие SetTargetPath, чтобы сохранить новый путь установки в сеансе установки.

person mcy    schedule 03.03.2014
comment
Вы не учли автоматическую установку или людей, которые хотят установить в X:\Program Files. - person Christopher Painter; 03.03.2014