Удалить файл во время незначительного обновления

У меня есть одна особенность с несколькими компонентами. Один компонент содержит динамически связанные файлы в каталоге. Когда я удаляю один файл в этом каталоге, собираю настройки и запускаю обновление, файл не будет заменен. В журнале я нашел эту ошибку:

MSI (s) (5C:D8) [12:28:41:180]: SELMGR: ComponentId '{8F4E8185-5B89-9FC9-9FD5-3200102A0265}' is registered to feature 'MyFeatureName', but is not present in the Component table.  Removal of components from a feature is not supported!
MSI (s) (5C:D8) [12:28:41:180]: SELMGR: Removal of a component from a feature is not supported

Как я могу удалить динамически связанный файл?

2 ответа

Ответ книги - использовать серьезное обновление.

Окончательный ответ хакера MSI - отредактировать предыдущий MSI в ORCA, чтобы получить точные значения первичного ключа и GUID. Создайте этот компонент статически в своем последнем ISM, а затем внедрите шаблон "прокол компонента". Это означает, что вы устанавливаете атрибут Revaluate и затем задаете ему условие, которое всегда оценивается как false. Таким образом, новый MSI все еще имеет компонент, но он удаляется с машины.

Крис описал метод, который я обычно использую для решения такой проблемы. Однако я считаю, что более быстрый подход заключается в переименовании родительской папки для динамически связанных файлов. Будет работать только переход с MyFolder на My Folder - или любое другое имя в этом отношении. Причина в том, что вы удаляете старые файлы из новых. Вы больше не указываете на те же абсолютные пути, и подсчет ссылок MSI, следовательно, удаляет все старые файлы правильно. И вам нужно серьезное обновление, чтобы это работало правильно, как говорит Крис.

Очень хорошее резюме того, что требуется для незначительного обновления для работы (а также другие подробности): http://www.installsite.org/pages/en/msi/updates.htm

С сайта выше: "Если вы удаляете файл или раздел реестра из компонента, вы должны заполнить таблицу RemoveFile или RemoveRegistry соответственно, чтобы удалить потерянный ресурс". Это также может работать, но я бы не стал использовать этот подход.

Лично я бы вообще избегал динамических ссылок на файлы. Я никогда не был в состоянии использовать динамически связанные файлы без этого, приводящего к проблеме. Как правило, они были проблемы обновления и исправления, но и другие виды. Это действительно не очень хорошая функция для использования. Скорее вы должны воспользоваться возможностью с изменением имени папки, чтобы добавить все файлы статически.

Вы можете найти более подробную информацию о подсчете ссылок компонентов MSI здесь: /questions/38274874/izmenit-guid-moego-komponenta-v-wix/38274883#38274883

Итак, вот что я хотел бы сделать:

  • Создайте резервную копию вашего установочного проекта
  • Удалить все динамически связанные файлы
  • Измените имя родительского каталога, который используется для размещения динамически связанных файлов. Например, из MyFiles в My Files.
  • Повторно добавьте все динамически связанные файлы со статическими компонентами.
Другие вопросы по тегам