Мы работаем над перестройкой нашего установщика с помощью WIX и Burn, используя специальное приложение для загрузки. Мы используем дерево функций в нашей основной MSI и установили EnableFeatureSelection = «да», чтобы мы могли реплицировать дерево функций в нашем пользовательском пользовательском интерфейсе BA и отправить эти параметры в MSI по времени планирования/приложения. Это все работает хорошо, пока мы не начали недавно тестировать процесс обновления. Мы впали в то, что, как представляется, открытая ошибка в прожигания:Wix - Как обрабатывать незначительные обновления с включенным включением функции?
http://wixtoolset.org/issues/4616/
Когда мы делаем незначительные обновления, функции, которые уже установлены не обновится ... первоначально установленный код остается на машина. Из проведенных нами тестов и исследований мы считаем, что это связано с тем, что Burn не передает REINSTALL = «ALL» в пакет MSI (что говорит об этой ошибке).
Мы нашли этот вопрос, где Роб говорит, что вам нужно обработать обратный вызов OnPlanMsiFeature(), который мы делаем правильно.
wix pass option to msi for repair
Поскольку выше ошибка была открыта с декабря 2014 года у нас не было уверенности, что она будет исправлена в ближайшее время, поэтому мы решили, что будет пытаться найти обходной путь. То, что мы придумали до сих пор, в лучшем случае взломано, но при доказательстве уровня концепции это показывает некоторые перспективы. Мы копируем весь узел MsiPackage, придавая снимку новый идентификатор и добавить свойство с REINSTALL = ALL на ней, как это:
<MsiPackage Id="MSI"
Cache="yes"
Compressed="no"
DisplayInternalUI="no"
Vital="yes"
Visible="yes"
EnableFeatureSelection="yes"
SourceFile="<path to MSI>">
</MsiPackage>
<MsiPackage Id="MSI_REINSTALL"
Cache="yes"
Compressed="no"
DisplayInternalUI="no"
Vital="yes"
Visible="yes"
EnableFeatureSelection="yes"
SourceFile="<path to MSI>">
<MsiProperty Name="REINSTALL" Value="ALL"/>
</MsiPackage>
Тогда в наших пользовательских BA, мы используем событие DetectRelatedMsiPackage для обнаружения незначительное обновление. И с помощью этого незначительного обнаружения обновления для установки RequestState для каждого MsiPackage либо локально или None внутри нашего обработчика PlanPackageBegin событий, как это:
if (e.PackageId == "MSI")
{
if (Operation == RelatedOperation.MinorUpdate)
{
e.State = RequestState.None;
}
else
{
e.State = RequestState.Present;
}
}
if (e.PackageId == "MSI_REINSTALL")
{
if (Operation == RelatedOperation.MinorUpdate)
{
e.State = RequestState.Present;
}
else
{
e.State = RequestState.None;
}
}
Мы надеемся иметь некоторые рекомендации от других людей, которые столкнулись с этой ошибкой с обновлениями в Burn с включенным EnableFeatureSelection. Поможет ли наше решение? Кроме того, существует ли способ динамически создавать MsiProperty из пользовательского BA, чтобы мы могли создать REINSTALL = ALL по мере необходимости? Есть ли у кого-нибудь другие идеи о том, как решить эту проблему, которая является более чистой и/или более надежной?
Если вам нужна дополнительная информация, то дайте мне знать. Мы работаем с Wix/Burn в течение пары месяцев, поэтому мы знаем некоторые вещи ... но мы пока не являемся экспертами.
Трудность здесь в том, что незначительное обновление - это строго обновление существующих установленных файлов с REINSTALLMODE = vomus REINSTALL = ALL, с учетом изменений в REINSTALLMODE, и показ выбора функции во время этого типа обновления - это то, что я очень сомнительный. Я подозреваю, что MSI не может одновременно добавлять и удалять функции при обновлении файлов. Я считаю, что вам стоит взглянуть на серьезное обновление - это обычный и простой способ установки обновленного продукта и отображения дерева функций. – PhilDW
@PhilDW, вы правы на основании того, что мы видели ...вы не можете изменить функции, которые вы выбрали в незначительном обновлении. Но мы не пытаемся. Мы просто хотим, чтобы функции, которые уже были установлены ранее, обновлялись до новых версий, и этого не происходит. Когда мы смотрим в журналы записи, мы НЕ получаем REINSTALL = ALL, когда он вызывает MSI. И никаких обновлений не происходит на ранее установленных компонентах ... у них все еще есть оригинальные версии. Основная проблема заключается в том, что ** EnableFeatureSelection ** нарушает незначительный процесс обновления ... и мы пытаемся найти хорошее обходное решение. – Doug