Удалите или переименуйте файлы во время незначительного обновления (патч wix 3.9)
Мы генерируем настройки автоматически каждую неделю, чтобы исправлять ошибки или вводить новые функции в наш продукт.
Все компоненты автоматически собираются в шаге (-ах) предварительной сборки библиотеки Wix. например:
Проект "%WIX%bin\Heat.exe" "%SolutionDir%projectNameXXX.Web\projectNameXXX.Web.csproj" -configuration %FlavorToBuild% -directoryid dirBE9FDAE56D974104BBF8070FB6CC7F69 -platform AnyPject -XNameXX-имя-файла-X-имя-файла-X-имя-файла-X-имя-файла-X-имя-файла-X-имя-файла-X-файла-объекта-файла-X-имя-файла-файла-файла-X-файла-объекта-файла-X-файла-файла-X-файла-объекта-файла-X-файла-файла-X-файла-объекта-файла-X-имя-файла-X-XP "%ProjectDir%projectNameXXX.Web.wxs"
Таким образом, есть компонент с "*" Guid для каждого файла, который мы развертываем.
Мы также автоматизировали создание патча между любой предыдущей версией нашей установки (скажем, V0) и текущей версией (V1). Патч создается и разворачивается, пока V1 не удаляет (или не переименовывает) файл. Мы не против, если файлы из V0 не будут удалены, пока обновленные файлы и новые файлы будут развернуты.
До сих пор я провел десятки тестов, например, с различными параметрами: добавив –sfdvital на свечу, чтобы заставить файлы не быть жизненно важными, но я наконец-то понял, что проблема связана с компонентами, а не с файлами…;
Другим важным тестом была установка жестко запрограммированных направляющих на 3 компонента в V0, которые я удалил в настройке V1. Сгенерированный патч будет установлен (файлы, которые будут удалены, все еще находятся на диске, все остальные обновления файлов будут развернуты). Когда установка удаляется, все удаляется, кроме 3 файлов. К сожалению, если программа установки V1 удаляет 3 файла, но добавляет 1 другой файл, патч не устанавливается, он останавливается, как только обнаруживает первый удаляемый файл.
SELMGR: ComponentId '{68FB7BC2-8D59-4CFB-88F5-9AA8CA570345}' зарегистрирован для функции ProductFeature, но отсутствует в таблице компонентов. Удаление компонентов из функции не поддерживается! Связанная тема:
Удалить файл во время незначительного обновления
не представляет жизнеспособного решения, так как я не могу применить технику "шаблона прокола" или добавить теги, поскольку это не может быть сделано автоматически. Или это может? Если пользователь должен отредактировать MSI V0, получить идентификаторы компонентов и добавить их в новый MSI или патч, это не решение для нас. Мы развернули более 25000 файлов. Серьезное обновление также не является решением. Любая идея будет приветствоваться!
2 ответа
Наконец-то нам удалось сгенерировать небольшие исправления, которые были успешно установлены.
Вот что мы сделали:
- У нас есть наш SetupV0.msi
- В PreBuildEvent нашего проекта установки wix мы запускаем dark.exe на SetupV0.msi, например:
"% WIX% bin \ dark.exe" "% OldSetupDir% SetupV0.msi" "% OldSetupDir% SetupV0.wxs"
- Файл WXS генерируется.
- Затем мы вызываем консольное приложение, которое считывает все GUID и идентификаторы компонентов из полученных wxs и для каждого из них пытается найти соответствие во всех библиотеках wxs, которые находятся в нашей рабочей области. Мы восстанавливаем все GUID и идентификаторы, которые не совпадают, и генерируем файл wxs с пустыми компонентами (которые имеют поддельные ключи реестра в качестве дочерних) и ссылками на компоненты. Этот сгенерированный wxs уже включен в проект установки.
- Затем происходит сборка и генерируется SetupV1.msi. Эта настройка содержит все идентификаторы компонентов и идентификаторы GUID V0 и, возможно, некоторые новые файлы.
- Затем в событии PostBuild мы создаем msp.
Возможно, это не самое удачное решение (не очень гордится ключами реестра), мы пытались добавить пустые теги createfolder, но теги create folder сделали патч не удаляемым.
Вы не можете удалить компонент, но вы можете пометить его как временный и связать со свойством со значением false, чтобы файл фактически не находился в системе. Компонент все еще там, но файл исчезнет. То же самое должно работать, если вы хотите переименовать файл. Как и выше, организуйте отсутствие файла и добавьте переименованный файл в качестве нового компонента к существующей функции.
Незначительные обновления действительно используются для исправления существующих ресурсов, а не для добавления, переименования или удаления их, поэтому наиболее безопасным решением является серьезное обновление.