Почему при использовании MSI рекомендуется ограничить развертывание файлов профилем пользователя или HKCU?
Почему рекомендуется ограничивать развертывание файлов в профиле пользователя или HKCU из моего MSI или установочного файла?
Развертывание является важной частью большинства разработок. Пожалуйста, дайте этому контенту шанс. Я твердо убежден в том, что качество программного обеспечения может быть значительно улучшено небольшими изменениями в дизайне приложений, чтобы сделать развертывание более логичным и более надежным - вот в чем заключается этот "ответ" - разработка программного обеспечения.
Это вопрос в стиле Q/A, отделенный от ответа, который стал слишком длинным: как избежать типичных ошибок проектирования в моем решении по развертыванию WiX / MSI?,
1 ответ
Как указывалось выше, этот раздел был отделен от существующего ответа с более широким охватом: как избежать типичных ошибок проектирования в моем решении по развертыванию WiX / MSI? (ответ, предназначенный, чтобы помочь разработчикам принимать лучшие решения по развертыванию).
9. Чрезмерное использование файлов и реестра для каждого пользователя.
Некоторые приложения не будут работать правильно для всех пользователей на компьютере, потому что пользовательские данные, добавленные во время установки, неправильно добавляются в профили и реестр других пользователей. Другими словами, приложение просто работает для пользователя, который установил программное обеспечение. Это, очевидно, серьезная ошибка проектирования.
Есть несколько способов "исправить" это, но весь вопрос развертывания файлов и настроек для каждого пользователя несколько запутан по нескольким фундаментальным причинам:
- Как вы подсчитываете количество компонентов, установленных несколько раз? (для каждого пользователя на машине)
- Что вы делаете с установленными данными и настройками при удалении?
- Как вы относитесь к новым файлам и параметрам для установки, которые отличаются от тех, которые находятся на диске и в реестре и имеют сделанные пользователем изменения? Конечно, вы не перезаписываете автоматически?
На самом деле нет четких ответов, но есть несколько альтернативных способов решения "проблем". Я предпочитаю варианты 2 и 3, так как я не думаю, что установщик Windows должен развернуть, отследить или попытаться изменить или еще хуже, вообще удалить пользовательские данные и настройки - это пользовательские данные, которые не должны вмешиваться:
9.1 Использование самовосстановления установщика Windows или аналогичного
Первый вариант - получить настройки и файлы, а также ключи реестра HKCU, правильно развернутые с помощью самой установки или функций, подобных настройке. Есть два основных способа сделать это: полагаться на "самовосстановление" установщика Windows, которое обычно запускается по объявленному ярлыку, или использовать Microsoft Active Setup.
Самовосстановление - это то, что происходит, когда вы запускаете ярлык для запуска приложения, и запускается установщик Windows, и вы видите индикатор выполнения во время установки "чего-то". Обычно добавляются записи реестра HKCU и файлы профиля пользователя.
Есть и другая альтернатива для достижения этой цели, она называется Active Setup и также является функцией Microsoft. По сути, он регистрирует "что-то работоспособное" для запуска один раз для каждого пользователя при входе в систему. Это может быть использовано для настройки пользовательских данных. Active Setup позволяет выполнять "все, что работает" - например, копирование файлов в профиль пользователя.,
Обе эти опции означают, что пользовательские данные и настройки копируются на месте один раз - и с тех пор они обычно не затрагиваются, но в случае "самовосстановления" могут быть удалены для любого пользователя, который фактически выполняет удаление приложение (если установка не предназначена для этого).
Хотя настройка пользовательских данных с помощью самовосстановления и Active Setup являются "установленными" методами для правильной работы приложений, кажется неправильным отслеживать пользовательские данные с помощью компонентов установщика Windows. Зачем? Потому что это действительно пользовательские данные, которые не должны вмешиваться после инициализации.
Соответственно, мой честный подход ко всей проблеме состоит в том, чтобы попытаться избежать развертывания пользовательских данных или ключей и значений реестра в целом, и это то, что описано далее как два других метода развертывания пользовательских данных.
9.2. Инициализация приложения пользовательских данных
Вторая альтернатива, которую я нахожу намного чище, - это изменение исполняемого файла приложения, чтобы иметь возможность инициализировать все настройки и файлы для каждого пользователя на основе настроек по умолчанию и шаблонов, скопированных из расположения на машине или на основе внутренних настроек по умолчанию приложения (из исходного кода) вместо того, чтобы писать их через вашу настройку.
В этом случае установщик Windows не будет отслеживать файлы или параметры, которые копируются для каждого пользователя. Он рассматривается как пользовательские данные, которые вообще не должны вмешиваться. Это позволяет избежать любых помех, таких как сброс или перезапись пользовательских данных во время обновлений и самостоятельного восстановления (а также ручного удаления и переустановки).
Если есть случаи, когда необходимо внести "исправления" в настройки приложения, это можно сделать, выполнив исполняемый файл приложения, обновляя настройки для каждого пользователя при запуске, а затем пометив реестр, что обновление было завершено.
Общий "вывод" заключается в том, что ваша установка должна подготовить ваше приложение к первому запуску, а не настраивать среду пользовательских данных и настроек. Все файлы профиля пользователя и настройки HKCU должны быть установлены по умолчанию приложением на случай, если они отсутствуют при запуске - это дает гораздо более надежное приложение, которое также легче тестировать для персонала QA. Это особенно важно для терминальных серверов, где самовосстановление вообще не разрешено. В таких случаях данные приложения будут отсутствовать, если вы полагаетесь на самовосстановление для размещения пользовательских данных на месте.
9.3 "Облако" или база данных хранилища пользовательских настроек
Чтобы сделать шаг вперед в сегодняшней "облачной среде" - и это, на мой взгляд, предпочтительный вариант. Почему ваше приложение должно быть ограничено файлами, ключами и значениями реестра? Почему бы не сохранить все пользовательские настройки в базе данных решения?
Полный доступ, контроль и постоянство всех настроек без каких-либо проблем с развертыванием.
Тем не менее, вы получаете новые проблемы управления, и они должны быть разделены между разработчиками, системными администраторами и администраторами баз данных. Но разве облако уже не является отраслевым стандартом?
Мы достаточно долго боролись с перемещаемыми профилями, поврежденным реестром пользователей, неправильно обработанными файлами данных пользовательских профилей и т. Д. Разработчики, избавьте себя от множества проблем и создайте себе новые проблемы управления базами данных вместо проблем развертывания - и начните кричать на целую новую группу людей!:-).
Настройки в базах данных:
Не страдает от "проблем с двумя источниками". Существует один экземпляр, и он обновляется в режиме реального времени. Не так, как проблемы с синхронизацией, наблюдаемые в профиле пользователя и в роуминге.
Проверяемый, управляемый и исправимый
Revisable (контроль версий - может восстановить старые настройки)
Вы можете даже "настроить" все пользовательские настройки из вашей настройки, запустив сценарии базы данных как часть развертывания, но если вы находитесь в корпоративной среде - это не просто поднятие заявки, и тогда ваш администратор базы данных может запустить Сценарии обслуживания с надлежащей поддержкой транзакций и откатом намного привлекательнее?
Даже если вы поставляете большое приложение для толстых клиентов для общего распространения и использования третьими лицами (другими словами, это не специализированное корпоративное клиент-серверное решение, где вы гарантированно имеете внутреннюю базу данных), следует рассмотреть возможность использования облачного хранилища. пользовательских настроек, когда пользователи входят в облако, используя свою электронную почту и т. п., а затем синхронизируют настройки в режиме реального времени.
Такие большие приложения, как правило, всегда должны "кэшировать" некоторые файлы настроек на компьютере и в HKCU, но представляется все более и более возможным сохранить все настройки в одном временном файле в области профиля пользователя, который является полностью "жертвенным" и даже возможным удалить, если он поврежден, а затем загрузить последние сохраненные настройки.
Вместо того, чтобы самостоятельно размещать облако, очевидно, что можно использовать корпоративные DBO для настройки своего собственного облака в масштабах всей компании, где они полностью контролируют все параметры, а также могут применять обязательные политики и ограничения для работы вашего программного обеспечения. Не говоря уже о правильном резервном копировании, которое возможно для всех пользовательских настроек.