Мне всегда было интересно, почему установщик Windows позволяет устанавливать только одну программу за раз. Очень неприятно отсутствие возможности запускать несколько установок, особенно при установке новой установки Windows. В чем причина этого?
Это сделано специально, чтобы избежать того, чтобы две установки управляли одними и теми же файлами / папками / ключами реестра / т. Д .; Возможно, это можно было сделать по-разному, но Microsoft сделала этот выбор.
Было бы очень сложно гарантировать корректность при одновременной установке, если предположить, что они совместно используют некоторые файлы. Для этого потребуется какая-то форма транзакций.
Эти концепции известны из транзакционных баз данных, но тема нетривиальна, и вы обычно не найдете полностью транзакционной инфраструктуры в файловых системах (хотя журнальные файловые системы обеспечивают ее часть). Одна из проблем заключается в том, что множественные блокировки могут привести к тупиковой ситуации - тогда вам понадобится обнаружение тупиковой ситуации (или оба установщика будут зависать навсегда) и способ ее решения. Тупиков можно избежать (например, всегда блокируя файлы в одном и том же порядке), но есть и другие проблемы:
Если вы заблокируете все необходимые файлы заранее, вы получите то, что у вас есть: один установщик должен дождаться завершения работы другого. Если вы не заблокируете все необходимые файлы заранее и продолжите работу, вы рискуете, что «транзакция» не удастся. Это будет означать, что один из установщиков придется перезапустить.
Затем вам, возможно, придется подумать об уровнях изоляции транзакций - чтобы быть полностью верным, ваши транзакции должны быть "сериализуемый" - но это непросто даже для многих баз данных.
Могут существовать даже альтернативные стратегии решения проблем, которые позволяют обойти полную изоляцию, но обычно бывает еще труднее доказать их правильность.
Я считаю, что при параллельной установке у нас было бы намного больше трудноразрешимых проблем после установки - особенно потому, что я не думаю, что поставщик ОС (или дистрибутив) приложит все усилия, чтобы сделать его на 100% чистым. Поэтому я бы предпочел не использовать его, даже если бы он предлагался ОС.
Заметка
Но, может быть, вы действительно хотите даже не устанавливать «одновременно». Может быть, было бы достаточно, если бы вы могли поставить в очередь установки, которые затем выполнялись одна за другой (в идеале, не задавая никаких вопросов между ними). И это действительно кое-что, некоторые другие ОС (дистрибутивы) справляются намного лучше.
Параллелизм: Вы можете удалить несколько файлов MSI для быстрой установки один за другим, используя командный файл. Вы не можете запускать два файла MSI одновременно в том смысле, что они оба записываются на диск одновременно.
Транзакция и откат: Причина в том, что часть установки MSI запускается как «транзакция» - последовательность изменений, которые либо фиксируются, либо откатываются в зависимости от того, завершились ли действия в списке транзакций без ошибок. Все должно завершиться без ошибок, после чего транзакция будет зафиксирована, иначе произойдет полный откат всех изменений. Следовательно, в любой момент времени может быть активна только одна такая транзакция.
Технические последовательности: На техническом уровне MSI только действия между стандартными действиями InstallInitialize
и InstallFinalize
в InstallExecuteSequence
выполняются как транзакция. Вне этих действий не должно происходить никаких системных изменений, но иногда файлы MSI ошибочно предназначены для внесения изменений в другие последовательности.
Ссылки: