2017-02-06 10 views
0

Настройка выглядит следующим образом: У меня есть пакет RTM wix (2.0), который имеет 3 пакета в цепочке. Будем говорить, что P1, P2 и P3. Независимо от того, важно ли это, P3 - это ExePackage, и именно это вызывает у меня проблемы. Кроме того, я использую bootstrapper, разработанный и поддерживаемый моей компанией, поэтому некоторые вещи, которые я могу контролировать, а некоторые я не могу.Как установить условия обнаружения и установки в цепочке исправлений пакета wix, чтобы продукт можно было удалить.

В пакете RTM P3 определяется следующим образом:

<PackageGroup Id="P3"> 
    <ExePackage Id="p3" 
       Cache="yes" 
       Compressed="yes" 
       PerMachine="yes" 
       Permanent="no" 
       Vital="yes" 
       InstallCommand="/quiet /norestart" 
       SourceFile="Resources\p3.exe" 
       DetectCondition="P3Version" 
       InstallCondition="Not P3Version" 
       UninstallCommand="/quiet /uninstall /norestart"> 
    </ExePackage> 
</PackageGroup> 

Все это работало хорошо, пока я не должен был написать исправление (патч) для пучка. В частности, для исправления P2. Первая проблема, с которой я столкнулся, заключалась в том, когда я попытался удалить исправление. Удаление исправления только в основном запускает переустановку в комплекте RTM, и поскольку P3 установлен, он заканчивается как НЕИНСТАЛИРОВАННЫЙ из-за вышеупомянутых условий.

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

вещей я попытался:

Запуска переустановки P3 от настраиваемого действия только планируется запустить на MSIPATCHREMOVE. Это, похоже, не работает, потому что, по-видимому, несколько MSI не могут выполняться одновременно.

Я добавил P3 к моей цепочке связок исправлений. Это устраняет проблему при удалении исправления только потому, что пакет исправлений теперь отключает P3, а затем переустановка RTM видит, что P3 не существует ... и устанавливает его снова. Но это вводит новую проблему. Я должен иметь возможность удалять весь продукт за один раз из меню ARP. Выполнение деинсталляции через меню удаления RTM должно также удалить все связанные пакеты. Когда это происходит, кажется, что оба пакета пытаются удалить P3. Кажется, что пакет исправлений выигрывает и удаляет exe из кеша пакета. Это приводит к ошибке в пакете RTM и не удается удалить.

Любые советы приветствуются.

ответ

1

Под горизонтальным правилом в основном описывается, почему вы ввернуты, но перечитывая сообщение. Я понимаю проблему немного больше, поэтому я даю вам более четкое решение.

Прежде всего, не используйте здесь InstallCondition. Я думаю, вы столкнулись с худшим сценарием, используя InstallCondition. Я думаю, что если вы удалите InstallCondition из описания исправления ExePackage, это все равно будет работать.

Что вы можете сделать, это изменить состояние плана вашего P3 ExePackage в коде приложения исправления для исправления только при удалении из загрузочного файла RTM.

(Это для неуправляемого C++ BA, должны быть применимы к C# один просто нужно найти правильные методы/обработчик событий)

Таким образом, в вашем исправлении BA, мы должны перейти к «OnPlanPackageBegin»

Здесь мы хотим сделать НИЧЕГО для P3 ExePackage, если исправление BA удаляется, а отношениеType не является NONE.Так что-то вроде этого я думаю

virtual STDMETHODIMP_(int) OnPlanPackageBegin(
    __in_z LPCWSTR wzPackageId, 
    __inout BOOTSTRAPPER_REQUEST_STATE *pRequestState 
    ) 
{ 
    // stuff that was here already 
    // ... 

    if (wcsstr(wzPackageId, L"p3") && m_command.relationType != BOOTSTRAPPER_RELATION_NONE) // "p3" should be the Id of the P3 ExePackage 
    { 
      pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE; 
    }  

    return CheckCanceled() ? IDCANCEL : IDOK; 
} 

Я не 100% уверен в RelationType, но я считаю, что это будет планировать ничего не делать для p3 ExePackage в исправлении БА, когда он удаляется/запустить другой загрузочное приложение. Таким образом, если вы удалите RTM, HotfixBA должен оставить только p3 ExePackage, чтобы он мог быть удален RTM BA.

Я бы протестировал с изменением/ремонтом RTM BA. Возможно, вам понадобится добавить что-то вроде && m_command.action == BOOTSTRAPPER_ACTION_UNINSTALL, возможно, к if, я не уверен.

Я бы также испытал сценарии обновления, потому что я не совсем уверен, что произойдет, когда он попытается удалить старый RTM BA. I думаю будет использовать хороший подсчет ссылок и оставить P3.exe позади, но я не уверен. Если он попытается удалить его, если это не так, вам может понадобиться автор нового P3.exe, который изменяет местоположение реестра (??) p3Version, чтобы старый BA считал, что он уже не установлен и ничего не делает. Если вы не можете изменить расположение реестра, вам может потребоваться изменить реестр, заплатив p3 до того, как MSI установит и удалит/переместит реестр версий и соответствующим образом обновит состояние обнаружения. Много рассмотреть здесь ...


Проблема ваша InstallCondition всегда ложно, если установлен продукт и, следовательно, всегда будет удалить. InstallCondition не ведет себя так, как я и ожидал, и теперь я в основном избегаю этого.

InstallCondition

Условия для оценки перед установкой пакета. Пакет будет установлен, только если условие оценивается как true. Если условие оценивается как false, а пакет устанавливается, исправляется или модифицируется, пакет будет удален.

Обычно вы хотите установить это как условие, которое ДОЛЖНО быть выполнено, чтобы ваш продукт работал правильно. Это также можно использовать как свойство для дополнительной установки, скажем, какое-то дополнение, которое пользователь может установить или нет во время фазы пользовательского интерфейса загрузчика.

Не используйте его как способ обнаружения, когда устанавливать, потому что это действительно «Обнаружить, когда можно установить и не устанавливать/удалять в противном случае». Условие обнаружения - это то, что вы используете, чтобы определить, когда устанавливать, если продукт отсутствует. Значение по умолчанию для InstallCondition всегда предполагает, что оно должно быть установлено.