Файл нового компонента не установлен, потому что был старый компонент с тем же файлом - PullRequest
2 голосов
/ 24 марта 2020

У нас проблема в том, что af ie не устанавливается после серьезного обновления

  • У нас есть серьезное обновление с <MajorUpgrade Schedule="afterInstallInitialize"...
  • У нас старый компонент с 1 файлом (xyz.exe Версия 12.34) от внешнего производителя
  • Теперь у нас есть новый файл от нового производителя с тем же именем (xyz.exe Версия 2.34). Новый файл имеет более низкий номер версии, чем старый.
  • Мы создали новый компонент в пакете установки и удалили старый компонент (фактически мы дали ему новый guid)
  • Изменение имя exe-файла невозможно, оно может сильно повлиять на документацию и внутренние функции.

При обычной установке все в порядке.

Но что теперь происходит на обновление:

  • Запустится установщик.
  • И обнаруживает, что существует новый компонент (xyz.exe) с более низкой версией, поэтому он не будет установлен.
  • программа установки запускает и удаляет старый компонент
  • Но он не устанавливает новый, потому что он только что обнаружил, что компонент уже установлен.
  • Выполнение восстановительной установки устраняет проблему, и файл снова появляется.

Настройка KeyPath к Компоненту устраняет проблему. Но это кажется мне неправильным. Каталог, в котором установлен этот файл, является основным каталогом установки.

Как принудительно установить этот компонент?

1 Ответ

1 голос
/ 25 марта 2020

Major Upgrade Downgrade : Чтобы перезаписать двоичные файлы с более высокими номерами версий при крупных обновлениях, есть несколько вариантов.

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

REINSTALLMODE : можно использовать свойство MSI REINSTALLMODE - но оно имеет ряд побочных эффектов:

Настройка 1 : Версия 1.0.0 для настройки:

msiexec.exe /i Setup1.msi /qn

Настройка 2 : Версия 2.0.0 для настройки основного обновления:

msiexec.exe /i Setup2.msi REINSTALLMODE=amus /qn

Несколько проблем : Есть несколько проблем с REINSTALLMODE, которые делают его небезопасной функцией (попробуйте вместо этого emus? См. Документацию - возможно, чуть менее грубая сила). Жаль, что этот параметр применяется ко всем функциям в настройке, что делает его очень опасным:

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

Сопутствующие файлы . Ниже приведен фрагмент использования сопутствующих файлов в WiX:

<..>

<Component Id="MyFile.exe" Feature="Main">
  <File Id="MyFile.exe" Source="MyFile.exe"></File>
</Component>

<Component Id="MyFile_2.exe" Guid="{0EBDFD64-017B-428F-BB67-3D82EA2A99AF}" Feature="Main">
  <File Source="MyFile_2.exe" CompanionFile="MyFile.exe"></File>
</Component>

<..>

Краткое описание в одну строку : во втором компоненте мы указываем на файл первого компонента, так что MyFile_2.exe установит всякий раз, когда MyFile.exe установлен - независимо от проблем с версиями.


Взлом двоичной версии : уродливо, но эффективный вариант - изменить версию двоичного файла, используя Visual Studio, чтобы установить более высокий номер версии. Побочных эффектов несколько:

  • вы нарушаете цифровые подписи
  • вы можете создать «путаницу версий»
  • существуют риски, связанные с написанием нового двоичного файла из Visual Studio
  • вам нужно продолжать делать это для новых версий
  • et c ...

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

«Загрузить из» : Поместить файл в общий доступ и загрузить его из указанного c расположения и удалить старую копию из папки установки. Может ли это работать? Это означает, что файл также может быть доставлен другой установкой в ​​этом месте.


Версия Lying : в Installshield существует концепция возможности установки конкретный c номер версии файла. Я не уверен, как реализовать это в WiX. Существует также «опция всегда перезаписи» , которая, очевидно, устанавливает максимальное значение для версии, поэтому существующий файл всегда перезаписывается.


Некоторые ссылки :

...