Каталог перемещаемого пользовательского профиля в MSI-установщике...

Автор Тема: Каталог перемещаемого пользовательского профиля в MSI-установщике...  (Прочитано 4566 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
WIX, MSI-инсталлятор.

Обнаружил следующую проблему в своём MSI-инсталляторе, устанавливающем BUNDLE-пакет: похоже, что в диалоговом окне установщика на этапе сборки жёстко прописывается логин разработчика, собиравшего MSI, вместо того, чтобы подставлять логин пользователя, с правами которог MSI запущен на выполнение. Поскольку мой логин на тестовой машине такой же как на той машине, на которой ведётся разработка, то проблема не была выявлена своевременно ибо в обозначенной ситуации никак себя не проявляла.



В интернете видел похожую проблему: http://stackoverflow.com/questions/1344222/wix-installer-environment-variables-do-not-expand-appdata

XML-разметка группы интересующих в данном контексте контролов выглядит следующим образом:

Код - XML [Выбрать]
  1. <Control Id="rbgrPath" Type ="RadioButtonGroup"
  2.         X="5" Y="80" Width="500" Height="100" Property="INSTALLFOLDER">
  3.   <RadioButtonGroup Property="INSTALLFOLDER">
  4.     <RadioButton
  5.      Text="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  6.      Value="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  7.      Height="13" Width="500" X="5" Y="5"/>
  8.     <RadioButton
  9.      Text="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  10.      Value="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  11.      Height="13" Width="500" X="5" Y="20"/>
  12.     <RadioButton
  13.      Text="$(env.AppData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  14.      Value="$(env.AppData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  15.      Height="13" Width="500" X="5" Y="35"/>
  16.   </RadioButtonGroup>
  17. </Control>
Кто-нибудь в курсе, как сделать так, чтобы использовался корректный логин?

P.S.
Я понимаю, что шансы получить ответы по поводу WIX на данном форуме стремятся к нулю, но мало ли...

Отмечено как Решение Андрей Бушман 12-10-2016, 17:10:01

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Несмотря на мою просьбу, А.Н. Ривилис не захотел удалять тему, т.к. посчитал, что она может кому-то пригодиться. Посему опубликовываю здесь же ответ на свой вопрос...

На stackoverflow Michael Urman дал ответ по обозначенной теме, а заодно и указал на др. ошибку, касающуюся %ProgramData%:

Цитата: Michael Urman
This is because $(env.AppData) and other preprocessor strings are evaluated when you build your package. The second radio button's value will also be incorrect on a machine that happens to use a system drive other than C: (or on older—hopefully unsupported—systems that don't use C:\ProgramData). So you should instead use run-time property substitutions:
  • $(env.ProgramData) should be replaced with [CommonAppDataFolder]
  • $(env.AppData) should be replaced with either [AppDataFolder] or [LocalAppDataFolder]
  • If [$(var.PLATFORMPROGRAMFILESFOLDER)] doesn't resolve to [ProgramFilesFolder] or [ProgramFiles64Folder], it should probably be changed to do so.
   
Note that it's fine to use additional directory properties to refer to these locations, as long as you are setting their values from the properties referenced above.

По поводу каталогов [ProgramFilesFolder] и [ProgramFiles64Folder] есть небольшой нюанс... Нужный вариант каталога я вычисляю следующим образом:

Код - XML [Выбрать]
  1. <!-- Define platform-specific names and locations -->
  2. <?if $(var.Platform) = x64 ?>
  3. <?define PLATFORMPROGRAMFILESFOLDER = "ProgramFiles64Folder" ?>
  4. <?else ?>
  5. <?define PLATFORMPROGRAMFILESFOLDER = "ProgramFilesFolder" ?>
  6. <?endif ?>

Т.о. препроцессор будет выбирать нужный вариант в зависимости от целевой платформы. Конечный, исправленный вариант выглядит так:

Код - XML [Выбрать]
  1. <Control Id="rbgrPath" Type ="RadioButtonGroup"
  2.         X="5" Y="80" Width="500" Height="100" Property="INSTALLFOLDER">
  3.   <RadioButtonGroup Property="INSTALLFOLDER">
  4.     <RadioButton
  5.      Text="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  6.      Value="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  7.      Height="13" Width="500" X="5" Y="5"/>
  8.     <RadioButton
  9.      Text="[CommonAppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  10.      Value="[CommonAppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  11.      Height="13" Width="500" X="5" Y="20"/>
  12.     <RadioButton
  13.      Text="[AppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  14.      Value="[AppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
  15.      Height="13" Width="500" X="5" Y="35"/>
  16.   </RadioButtonGroup>
  17. </Control>
  18.  

ВАЖНО!
Особое внимание следует обращать на то, что после квадратных скобок, в которые заключены имена переменных, не должен стоять слэш ("\"). В противном случае будем получать ошибку ICE34.