Значение Wid Directory Id не установлено для тихой установки - PullRequest
0 голосов
/ 02 июня 2018

У меня проблема с моим проектом WIX.Когда я делаю нормальную установку графического интерфейса, все работает как положено.Тем не менее, когда я делаю / q (тихую) установку, один из символов моего каталога не устанавливается.(Вероятно, потому что не было последовательности пользовательского интерфейса для тихой установки. Однако, меня удивляет, что именно я делаю неправильно.)

В моем файле Product.wxs у меня есть дерево каталогов, которое начинается следующим образом.:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="COMPANY" Name="Company">
      <Directory Id="BRANCHALL" Name="Branch">
        <Directory Id="INSTDIR" Name="Replaced">
          <Directory Id="BINDIR" Name="Bin">

Как раз под этим я устанавливаю каталоги, потому что наша установка приложения принимает идентификатор установки в качестве строки ввода пользователя, которая становится частью пути к каталогу.(Это также может быть передано в командной строке установки без вывода сообщений.) Следовательно, как раз под определением дерева каталогов выше, у меня есть:

<SetDirectory Id="INSTDIR" Value="[BRANCHALL]\[INSTID]" Sequence="execute" />
<SetDirectory Id="BINDIR" Value="[BRANCHALL]\[INSTID]\Bin" Sequence="execute" />

... и т. Д.

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

MSI (s) (F8:84) [20:55:29:702]: Product: ProductName - Instid -- Error 1606. Could not access network location \Instid.
Error 1606. Could not access network location \Instid.
Action ended 20:55:29: CostFinalize. Return value 3.
Action ended 20:55:29: INSTALL. Return value 3.
Property(S): UpgradeCode = {9AC2D8DF-5EF7-440B-A0D2-4A97FA62368C}
Property(S): INSTID = Instid
Property(S): BRANCHALL = C:\Program Files (x86)\Company\Branch\
Property(S): POWERSHELLEXE = C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
Property(S): BINDIR = \Instid\Bin

Обратите внимание, что, хотя зарегистрированное значение BRANCHALL является правильным, символ BINDIR пропускает значение BRANCHALL, но действительно получает значение INSTID.

Тот же самый фрагмент журнала, когда я запускаю установку с графическим интерфейсом (без вывода сообщений):

Property(C): UpgradeCode = {9AC2D8DF-5EF7-440B-A0D2-4A97FA62368C}
Property(C): INSTID = Instid
Property(C): BRANCHALL = C:\Program Files (x86)\Company\Branch\
Property(C): POWERSHELLEXE = C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
Property(C): LicenseAccepted = 1
Property(C): BINDIR = C:\Program Files (x86)\Company\Branch\Replaced\Bin\

Как ни странно, свойство BRANCHALL развивается, а INSTID - нет.Тем не менее, установка работает правильно и помещает все файлы в правильные папки.Поэтому INSTID, должно быть, разработал после того, как msiexec сделал эти журналы.

Если вам не хватает необходимой информации, пожалуйста, спросите меня.Я немного озадачен и, конечно, не эксперт по WIX.Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Чтобы понять это, сначала поймите, что отрывок из вашего журнала выполнен с конца, но он отражает различные операции, которые произошли в определенном порядке.Как указывает в своем ответе Стейн, созданные вами элементы SetDirectory реализованы как настраиваемые действия, задающие свойства.В частности, <SetDirectory Id="INSTDIR" Value="[BRANCHALL]\[INSTID]" Sequence="execute" /> устанавливает свойство с именем INSTDIR в значение от форматирования [BRANCHALL]\[INSTID] до CostFinalize.

Это проблема, поскольку до того, как CostFinalize создаст дерево каталогов, BRANCHALL не имеет значения.Когда отображается пользовательский интерфейс, CostFinalize запускается один раз в каждой последовательности.Первый заполняет BRANCHALL и использует путь по умолчанию для INSTDIR.Затем вторая (исполняемая) последовательность использует заполненный BRANCHALL для определения INSTDIR, маскируя проблему.Но без интерфейса используется пустое значение.Вы должны быть в состоянии подтвердить это в своем подробном журнале, если будете искать, где значения свойств изменены.

Так в чем же проблема?По крайней мере, в вашем отрывке представляется, что вы можете предсказать значение по умолчанию BRANCHALL, используя только предопределенные свойства, и, таким образом, должны иметь возможность соответствующим образом изменить авторизацию SetDirectory:

<SetDirectory Id="INSTDIR" Value="[ProgramFilesFolder]Company\Branch\[INSTID]" Sequence="execute" />
<SetDirectory Id="BINDIR" Value="[ProgramFilesFolder]Company\Branch\[INSTID]\Bin" Sequence="execute" />

Однако естьпотенциальная проблема сделать это таким образом.Если вы позволите конечному пользователю изменить любое из расположений, которые используются в BRANCHALL в вашем пользовательском интерфейсе, это переопределит это.Если этот сценарий имеет значение для вас, я думаю, что указание Sequence="first" вместо Sequence="execute" решит эту проблему.(Но вам нужно будет выполнить некоторые тесты, чтобы быть уверенным, что это помогает.) Кроме того, для автоматических установок, которые хотят переопределить это, вам может потребоваться задокументировать более полный набор свойств, которые необходимо указать, и способы их указания.Соответственно, вам может потребоваться добавить некоторые условия к этим элементам SetDirectory в соответствии с Not INSTDIR / Not BINDIR или Not I_CHANGED_THE_DIRECTORIES.


Если возможно, я бы порекомендовал другой подход: поместитезначение для INSTID в таблице каталогов вместо использования пользовательских действий для переопределения неправильного.Основным недостатком является то, что для этого требуется создать и использовать преобразование для его установки, а не просто передать значение в командной строке.Но преимущество заключается в том, что установщик Windows просто обрабатывает каталоги, как обычно.

0 голосов
/ 03 июня 2018

У меня нет времени, чтобы написать полный ответ прямо сейчас, но вот несколько советов:

Технический : когда вы ссылаетесь на другое свойство каталога вваше пользовательское действие set set / set directory, я полагаю, вам нужно запустить настраиваемое действие после CostFinalize, чтобы другое свойство вообще было установлено на любое значение.Когда вы делаете это, вам нужно использовать Type 35 custom action, а не Type 51 custom action.См. MSDN: Изменение целевого местоположения для каталога .Мой тест на дым с использованием Type 35 action, похоже, сработал.Завтра я опробую еще и уточню ответ более подробно.


Внимание!Не проверено должным образом :

<SetProperty Id="INSTDIR" Value="[BRANCHALL]\[INSTID]" After="CostFinalize" />

Вы можете попробовать использовать вышеупомянутую разметку вместо ваших текущих элементов SetDirectory.После компиляции MSI необходимо «исправить» его, чтобы изменить настраиваемое действие с Типа 51 на Тип 35 в Таблице настраиваемых действий (просто измените 51 на 35 в столбце Тип), а затем запустить тестовую установку.Используйте Orca или эквивалентный для этого исправления. Я просто добавил это, чтобы вы могли попробовать, я не проверял это должным образом .


Альтернативы? : В целом, я рекомендую вам не перенаправлять свойства папки таким образом.Я считаю, что это ненадежно и пронизано неожиданными проблемами.На самом деле, я не вижу, как этот подход позволит вам установить MSI несколько раз - из-за общего дизайна установщика Windows (который не допускает одновременной установки напрямую).Если вы хотите установить один и тот же MSI несколько раз, то есть пара уже существующих ответов, которые вы можете просмотреть:

Я не знаю, находитесь ли вы в корпоративной обстановке или нет, но App-V используется многими корпорациями.Это не моя чашка чая (в настоящее время, по крайней мере), но следует упомянуть, что вы должны сориентироваться в отношении того, что может удовлетворить ваши требования (что нам еще нужно правильно понять).

Это неполно,проверю завтра.

...