ADDLOCAL = FEATURE1 в MSI установщик удаляет другие ОСОБЕННОСТИ - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь установить один из FEATURE_NEW с помощью установщика wix setup.exe (2.0) поверх setup.exe (1.0) setup.exe / v / qn ADDLOCAL = FEATURE_NEW

Он устанавливает FEATURE_NEW, но проблема в том, что он удаляет другие функции FEATURE1, FEATURE2 и т. Д.

Я хочу, чтобы существующая функция должна была обновиться, а новая FEATURE_NEW была установлена, дополнительные функции не должны быть установлены.

Так что мой вопросМожно ли установить / обновить продукт с ранее установленным списком функций 'N' плюс недавно добавленная функция, т.е. N + NEW_FEATURES.Я ищу что-то вроде

setup.exe / v / qn ADDLOCAL = INSTALLED_FEATURES, FEATURE_NEW

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Если вы выполняете ADDLOCAL, то вы явно перечисляете функции, которые вы хотите установить - установленные вами функции - это то, что вы указываете.Он не является инкрементным и не означает «также установить эти функции».Например, он отключает функциональные условия.Если вы хотите добавить функции во время крупного обновления с помощью загрузчика, вы можете использовать MsiEumFeatures (), чтобы получить список установленных функций, в который вы добавляете новые.Другой способ - использовать настраиваемое действие для анализа строки ADDLOCAL, упорядоченной после MigrateFeatureStates, и добавить новую в список.

0 голосов
/ 19 мая 2018

Раунд 2 :

MigrateFeatureStates : я вижу, вы обновили свой вопрос.Похоже, вы имеете дело с функциями.Я предполагаю, что вы используете значительное обновление с версии 1 до версии 2?Прежде всего, стандартное действие MSI MigrateFeatureStates попытается «сохранить» состояние установки компонента для основных обновлений - если основное обновление настроено для этого в таблице Upgrade (столбец атрибутов), просто чтобы упомянуть его.

Свойства элемента : Другими словами, если вы не не установите никаких свойств элемента (ADDLOCAL, ADDSOURCE, REMOVE, ADVERTISE и т. Д.), Затем вашновая версия должна наследовать структуру элементов вашей первой версии и автоматически устанавливать все новые функции автоматически (при условии, что они установлены для установки по умолчанию).

MSI API : Исходя из этого, я не уверен, что ваше конкретное добавление функции необходимо, но возможно, если ваша функция не установлена ​​для установки по умолчанию.Как уже говорилось, я не знаю, как извлечь текущее состояние функции из командной строки (может быть одна), но вы можете использовать MSI API и затем вызывать новую установку через MSI API иликомандная строка (или каким-либо другим способом).

Управление функциями : у меня был устаревший VBScript, который я мог быстро адаптировать для генерации msiexec.exe командных строк для состояния функцииманипулирование, но прежде чем вдаваться в это, следует упомянуть, что вы можете использовать несколько механизмов в пределах вашего пакета MSI для управления выбором функций: Как установить функцию на основе набора свойств в настраиваемом действии? По сути, вы можете использовать произвольное действие для управления выбором функции по желанию .Вы можете детально осмотреть систему, чтобы определить, какие функции следует устанавливать, а какие нет.Вы также можете использовать условия объекта , чтобы повлиять на выбор объекта без единой строки кода (без пользовательских действий).Смотрите связанный ответ чуть выше (рекомендуется).В этом ответе также есть раздел «Возможности MSI», который пытается объяснить это: Wix Installer: установка свойства условия компонента при установке администратора MSIEXEC из командной строки

Управление функциями графического интерфейса пользователя : Я также хочу добавить, что вы, очевидно, можете изменить состояние функции в графическом интерфейсе MSI, если в вашем графическом интерфейсе есть диалоговое окно «Пользовательский», где вы можете увидеть функции, которые собираются установить наsystem.

Сводка : Таким образом, в итоге вы можете манипулировать функциями с помощью условий элементов и пользовательских действий изнутри вашегоMSI - и вы также можете попросить пользователя в интерактивном режиме изменить выбор функции и вручную в графическом интерфейсе.Если этого недостаточно, вы можете получить состояние функции для установленного MSI, используя MSI API, как показано в VBScript ниже.Сценарий создает фрагмент командной строки, который будет реплицировать состояние установленной функции со всеми добавлениями, которые вы делаете в указанном месте в сценарии.Вам необходимо ввести код продукта для MSI, для которого вы хотите получить состояние функции: Как найти GUID продукта с установленной установкой MSI? (просто получите его изтаблица свойств вашего MSI или из вашего источника WiX - эта ссылка только для справки).Сценарий по умолчанию получает состояние функции для общего пакета времени выполнения, который может присутствовать на вашем компьютере.

Полагаю, это дает несколько реальных параметров:

  1. Положитесь на MigrateFeatureStatesдля добавления любых новых функций в версии 2. По умолчанию для новых функций должна быть установлена ​​установка.
  2. Задание свойств функции с помощью настраиваемого действия или условий функции.
  3. Извлечение текущих установленных состояний функций с помощью MSI API и установка новой версии через msiexec.exe с настраиваемыми свойствами функций настройки пользовательских командных строк.
  4. Заставьте пользователя добавлять интерактивные функции, которые ему нужны, в интерактивном режиме в GUI.*
  5. Все, что я забыл.

Этот скрипт легко расширить, чтобы сообщать обо всех состояниях функций для всех установленных пакетов MSI (что фактически делал скрипт перед его адаптацией).).

On Error Resume Next

Public cmdline

' Sample Product Codes:
  ' Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.17: {9A25302D-30C0-39D9-BD6F-21E6EC160475}

productcode = InputBox("ProductCode for your MSI:", "ProductCode:","{9A25302D-30C0-39D9-BD6F-21E6EC160475}")
If productcode = vbCancel Or Trim(productcode) = "" Then
   WScript.Quit(0)
End If

' Arrays of current feature states
ReDim ADDLOCAL(-1), ADDSOURCE(-1), ADVERTISE(-1), REMOVE(-1)

Set installer = CreateObject("WindowsInstaller.Installer")
Set productfeatures = installer.Features(productcode)
If (Err.number <> 0) Then
   MsgBox "Failed to open MSI package. Invalid product code?", vbCritical, "Fatal error. Aborting:"
   WScript.Quit(2)
End If

' Spin over all product features detecting installation states
For Each feature In productfeatures

    featurestate = installer.FeatureState(productcode, feature)

    ' Using crazy VBScript arrays
    Select Case featurestate
       Case 1 ReDim Preserve ADVERTISE(UBound(ADVERTISE) + 1) : ADVERTISE(UBound(ADVERTISE)) = feature
       Case 2 ReDim Preserve REMOVE(UBound(REMOVE) + 1) : REMOVE(UBound(REMOVE)) = feature
       Case 3 ReDim Preserve ADDLOCAL(UBound(ADDLOCAL) + 1) : ADDLOCAL(UBound(ADDLOCAL)) = feature
       Case 4 ReDim Preserve ADDSOURCE(UBound(ADDSOURCE) + 1) : ADDSOURCE(UBound(ADDSOURCE)) = feature
       Case Else ' Errorstate MsgBox "Error for feature: " + feature
    End Select

Next

' Now add whatever feature you need to ADDLOCAL, here is just a sample:
ReDim Preserve ADDLOCAL(UBound(ADDLOCAL) + 1) : ADDLOCAL(UBound(ADDLOCAL)) = "MyNewFeature"

' Flatten arrays
If UBound(ADDLOCAL) > -1 Then cmdline = chr(34) + "ADDLOCAL=" + Join(ADDLOCAL, ",") + chr(34)
If UBound(REMOVE) > -1 Then cmdline = cmdline + + " " + chr(34) + "REMOVE=" + Join(REMOVE, ",") + chr(34)
If UBound(ADVERTISE) > -1 Then cmdline = cmdline + + " " + chr(34) + "ADVERTISE=" + Join(ADVERTISE, ",") + chr(34)
If UBound(ADDSOURCE) > -1 Then cmdline = cmdline + + " " + chr(34) + "ADDSOURCE=" + Join(ADDSOURCE, ",") + chr(34)

' Your current feature installstate translated to msiexec.exe command line parameters
Wscript.Echo cmdline ' MsgBox has 1024 character limit

Раунд 1 :

Функции : если вы хотите получить текущий установленное свойство продукта установленного состояния (компоненты выбираются пользователем по выбору: Program, Dictionaries, SDK, Help, Tutorials и т. д.), то естьвозможно через API MSI .Я не знаком со способом получения состояния установки функции через командную строку msiexec.exe.

Компоненты : Если вы имеете в виду компоненты MSI (атомарные биты установщика, которые назначаются на выбираемые пользователем функции, но никогда не видны пользователю напрямую), тогда я не до конца понимаю, чего вы пытаетесь достичь.ADDLOCAL является одним из свойств параметров установки компонента , и он влияет только на состояние установки компонента, он только косвенно влияет на компоненты (те, которые назначены для функции, на которую вы ссылаетесь).

Основное обновление : Мне интересно, не осуществили ли вы надлежащее серьезное обновление, и это реальная проблема, с которой вы столкнулись.Пожалуйста, обновите ваш вопрос с более подробной информацией.Правильно выполненное серьезное обновление установит все новые компоненты, удалит устаревшие, а также установит все новые функции, которые вы добавили.Прежде чем я напишу больше, уточните ваш вопрос.

У меня есть VBScript, который будет извлекать текущее состояние функции указанного вами продукта (или для всех установленных файлов MSI в этом отношении).Если это действительно то, что вы после.

...