Как избежать удаления ранее установленного ExePackage (распространяемых файлов) при установке пакета WiX?

У меня есть пакет, который устанавливает и удаляет Redist VC 2012. Он работает нормально, если ранее не было установлено VC 2012 redist. если уже установлен редист VC 2012, то при удалении моего пакета он также удаляет редист VC 2012. Все, что я хочу, это то, что он не должен удалять редист VC 2012, если он был установлен ранее. Я пытался использовать переменный элемент с постоянным атрибутом, установленным на «да». Но я не уверен, как это работает. любые указатели на это очень ценятся.


person user2744810    schedule 03.09.2013    source источник
comment
Я не хочу, чтобы это было постоянным, если мой пакет устанавливает его. Я хочу удалить его, когда я его установил, но не удаляйте его, когда он уже установлен.   -  person user2744810    schedule 06.09.2013


Ответы (2)


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

К сожалению, VCRedist не документирует стандартный ключ Provides, поэтому нет реального способа правильно подсчитать количество ссылок на пакет. Таким образом, команда VCRedist ожидает, что вы пометите его как постоянный.

person Rob Mensching    schedule 12.09.2013
comment
Спасибо, Роб. Есть ли способ, которым переменная может хранить информацию о том, установил ли пакет пакет или нет? На данный момент я нашел обходной путь, создав 2 промаха с именами pre и post и интегрировав их в пакет до и после пакета vc redist 2012. pre записывает переменную реестра, говорящую, что погода vc redist была установлена ​​ранее или нет. Я использую этот реестр в условии обнаружения пакета vc redist. теперь, потому что условие обнаружения удалит пакет во время удаления. - person user2744810; 21.09.2013
comment
теперь, если pre обнаружил vc redist и сделал реестр истинным, то Post msi изменит реестр на значение, которое будет ложным для условия обнаружения vc redist при удалении. Вот как я это делаю прямо сейчас. - person user2744810; 21.09.2013
comment
На данный момент это служит моей цели, но сделать vc redist постоянным — хороший вариант. Но я думал о пакетах, отличных от vc redist, которые необходимо удалить и использовать этот метод. - person user2744810; 21.09.2013

Используете ли вы элемент ExePackage для установки Redist?

Если это так, есть элемент «Постоянный», который вы можете установить, чтобы предотвратить его удаление при удалении пакета.

person bmoberly    schedule 04.09.2013
comment
Спасибо за Ваш ответ. Но я не хочу, чтобы он был постоянным, если мой пакет устанавливает его. Я хочу удалить его, когда я его установил, но не удаляйте его, когда он уже установлен. Возможно ли это, используя постоянный атрибут? - person user2744810; 06.09.2013
comment
Похоже, постоянный атрибут только предотвращает удаление пакета. Можно использовать DetectCondition и InstallConditions, чтобы не устанавливать пакет, если он уже присутствует. Вам нужно будет проверить, но я думаю, что загрузчик не удалит пакеты, которые он изначально не устанавливал. - person bmoberly; 06.09.2013
comment
НО - вы действительно можете попасть в беду, делая это. Представьте себе сценарий, в котором ваш загрузчик первым установил redist. а затем пользователь устанавливает другую программу, которая также нуждается в перераспределении. Если пользователь удалит вашу программу, он также удалит Redist, что сломает вторую программу. - person bmoberly; 06.09.2013
comment
Аарон Стебнер рекомендует не удалять Redist. package, потому что он может использоваться другими программами. Это действительно старое обсуждение (2008 г.), но для получения дополнительной информации прочитайте комментарии здесь: blogs.msdn.com/b/astebner/archive/2007/02/07/ - person bmoberly; 06.09.2013
comment
Я не думаю, что загрузчик помнит, какую установку он установил в соответствии с моим тестированием. DetectCondition кажется обязательным для удаления. если он не предоставлен или если он оценивается как false, то повторная деинсталляция не происходит. Если он оценивается как true, он удалит Redist, даже если он не был установлен им. - person user2744810; 07.09.2013