Удалить файл во время незначительного обновления
У меня есть одна особенность с несколькими компонентами. Один компонент содержит динамически связанные файлы в каталоге. Когда я удаляю один файл в этом каталоге, собираю настройки и запускаю обновление, файл не будет заменен. В журнале я нашел эту ошибку:
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.
- Повторно добавьте все динамически связанные файлы со статическими компонентами.