Установщики предыдущих версий нашего программного обеспечения включают в себя компонентный файл, который был NOT с пометкой Permanent="Yes"
. Теперь мы хотим прочитать содержимое предварительного обновления этого файла во время процесса обновления, которое перезапишет файл с другим содержимым. Есть ли хороший способ сделать это?Как можно сохранить содержимое установленного файла с пометкой Permanent = "No" во время обновления?
Как можно сохранить содержимое установленного файла с пометкой Permanent = "No" во время обновления?
ответ
Предполагая, что этот файл является файлом конфигурации, таким как XML-файл, я считаю, что это просто сложная область установщика Windows. Вы отправляете файл версии 1, конечный пользователь модифицирует определенные атрибуты, а затем вы отправляете файл версии 2, в который вы хотите сохранить эти настройки.
Проблема в том, что это очень сложное слияние. Он работает несколько нормально, если вам нужно только 1-2 атрибута, но если мне нужно сохранить все это, вы застряли между потерями всех настроек или не получая изменений от версии 2 файла.
Вы можете написать подробные пользовательские действия, чтобы сделать все это во время установки, но я предлагаю, что есть лучший способ: иметь 2 файла.
1 файл, который принадлежит установщику и может быть всегда перезаписан, и 1 файл, принадлежащий приложению, который хранит переопределения. Думайте об этом как файл преобразования. Установщик не знает об этом файле, чтобы он никогда не перезаписывал и не удалял его. (Само определение пользовательских данных с точки зрения MSI.)
Например, схема .NET Framework Web.Config AppSettings element имеет атрибут файла, который был разработан так, чтобы поддерживать это.
Задает относительный путь к внешнему файлу, содержащему настраиваемые параметры конфигурации приложения . Указанный файл содержит те же настройки, которые указаны в элементах,, и , и использует тот же формат пары ключ/значение, что и те элементы . Указанный путь относится к основной конфигурации . Для приложения Windows Forms это будет двоичная папка (например,/bin/debug), а не расположение файла конфигурации приложения . Для приложений Web Forms путь относительный к корню приложения, где находится файл web.config.
Обратите внимание, что среда выполнения игнорирует атрибут, если указанный файл не может быть найден .
Это поможет, если вы скажете, что именно вы делали, что приведет к перезаписи файла. Некоторые основные обновления (это то, что вы делаете?) Сначала начнет полную деинсталляцию продукта, а затем полную установку нового продукта. Если это ситуация, используйте пользовательское действие, упорядоченное до RemoveExistingProducts, чтобы создать резервную копию файла где-нибудь, чтобы ваше приложение могло получить контент или получить контент, который вам нужен, прежде чем он будет оформлен.
Если вы выполняете крупную модернизацию, описанную позже (например, afterInstallExecute), или вы делаете патч, то отнюдь не обязательно, что файл будет перезаписан, поскольку правила перезаписи файлов не заменят обновленный файл поскольку он был установлен.Если приложение изменило файл, то этот тип обновления не будет перезаписывать его:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx
Или в том случае, если файл не изменяется, так как он был установлен, изменить даты, так что, как представляется, быть изменен, так как Описанная здесь:
это также не ясно, что постоянный = да, что вы хотите в любом случае - что бы склеить файл в системе навсегда. Возможно, вы думаете о NeverOverwrite, но обычно это не требуется, если приложение меняет файлы и легче решать во время обновления (путем изменения дат) вместо того, чтобы делать NeverOverwrite, когда иногда неясно, что может понадобиться продукту в будущем.
Комментарий относится к извлечению предыдущей версии продукта во время обновления. Есть несколько способов сделать это:
Если вы знаете ProductCode предыдущей версии, MsiGetProductInfo (и их эквивалентов в сценарии и т.д.) будет возвращать значение версии продукта или строки:
https://msdn.microsoft.com/en-us/library/aa370130(v=vs.85).aspx
Или если вы предпочитаете не кодировать значение, MsiEnumProducts, передающий UpgradeCode, вернет список установленных ProductCodes. Этот метод наиболее полезен, если у вас есть собственный загрузчик или пользовательский интерфейс, где вы хотите показать пользователю текущую установленную версию.
В основном обновлении WiX ассоциированное свойство (WIX_UPGRADE_DETECTED) представляет собой список обнаруженных ProductCodes (как правило, список из них), поэтому вы можете использовать его для получения версии обновляемого продукта. В небольшом VBScript например, что-то вроде:
множества установщиком = CreateObject ("WindowsInstaller.Installer")
и:
prodversionstring = installer.productinfo (WIX_UPGRADE_DETECTED, "VersionString")
поможет вам приблизиться.
Мы делаем только крупные обновления. Файл, который я хотел бы сохранить, содержит текущий номер версии. Мы удаляем этот файл при установке, потому что наши пользователи могут обновиться до любой будущей версии. Во время обновления мы хотели бы знать, какая версия обновляется для слияния конфигурации. Пользователи с уже установленными версиями не могут начать с чистой установки, их можно только обновить. Можем ли мы использовать RemoveExistingProducts в новых версиях установщика для сохранения файлов? Как вы знаете, хороший способ получить информацию о предыдущей версии из ОС во время обновления? – badgerbadger
Добавлен ответ ... – PhilDW