Эволюция инсталляторов


    Товар в красивой упаковке проще продавать. А программу в хорошем инсталляторе?

    Ведь не факт, что инсталлятор — аналог упаковки. Это скорее процесс вынимания продукта из коробки. Много раз нажать «Next», в самом конце — «Finish», и никакого там аккуратного развязывания ленточек. Порвали слюду, небрежно вскрыли коробку — «Что там у нас внутри?»

    Сама коробка не представляет особой ценности. Для некоторых товаров специально делают бюджетную упаковку. Зато важно, чтобы процесс был предсказуемым. Если инсталлятор предсказуем, то его внешний вид и возможности не имеют значения. Но когда что-то пойдёт «не так», или пользователю вдруг не хватит стандартных опций, всплывут все недостатки — как внешнего вида, так и возможностей.

    Чего хотят от инсталляторов


    Корпоративному пользователю, например, будет интересно узнать, как поставить программу в silent режиме, и какие у инсталлятора имеются ключи командной строки. Поддержка стандартного для Windows msi-файла инсталлятора тут окажется как нельзя кстати.

    Если инсталлятор задаёт сложные вопросы, важно, чтобы они были на языке, понятном пользователю. Угадать этот язык сразу — та ещё проблема. Язык интерфейса операционной системы не всегда будет правильным выбором. Поэтому предоставление возможности выбора языка является неотъемлемой частью современных инсталляторов.

    Раньше мы уже писали о том, как можно реализовать выбор языка и сделать «настоящий» msi. Мы научились ценить традиции разных языковых культур и уважать строгие корпоративные требования. Но всё ли учтено? Ведь кто-то вместо инсталлятора захочет сразу иметь portable-версию программы. А пользователи, работающие под учетной записью с ограниченными правами? Многие программы они просто не могут поставить, не позвав администратора. И не всегда это ошибка администратора, чаще — разработчика.

    Инсталляторы «два в одном»


    Сразу после запуска инсталлятора, можно предлагать не только установить программу, но и запустить её без установки. Такая программа может хранить файлы настроек и данные пользователя в одной папке с инсталлятором, выступая одновременно и инсталлятором, и portable-версией. А для распаковки программы из msi, всегда можно использовать административную установку — мало кто знает, что она создавалась как раз для этой цели. Надо только не забыть удалить временные файлы по завершении работы программы.

    Такой подход избавляет от необходимости переделывать концепцию огромной зелёной кнопки «Скачать» на сайте, т.к. одного файла будет достаточно тем, кто хочет программу установить — и тем, кто хочет ее запустить только один раз, и даже тем, кто хочет носить ее с собой на флешке. Несложно научить программу работать с заданным файлом настроек и хранить пользовательские данные по заданному пути. Важно не трогать реестр, а в случае интеграции с другими программами — предусмотреть поддержку относительных путей. И не стоит забывать, что файл инсталлятора внезапно может оказаться на компакт-диске :-).

    Ограниченные права учетной записи


    Домашние пользователи, а также сотрудники компаний, в которых работают добрые системные администраторы, с такой проблемой не сталкиваются. Разработчики, впрочем, тоже. Работая на своих компьютерах с неограниченными правами, мы часто забываем о поддержке пользователей с ограниченными возможностями правами.

    Дело в том, что в Windows Installer имеется два способа установки программы — для всех пользователей системы (самый распространённый), и для текущего пользователя, запустившего инсталлятор. Причём в корпоративном мире не редкость, когда у текущего пользователя недостаточно привилегий для установки программы в режиме «для всех пользователей».

    Чтобы сделать инсталлятор, поддерживающий оба способа установки, и без проблем работающий на Windows Vista (в Windows 7 добавили поддержку т.н. «Single Package Authoring»), разработчику необходимо предпринимать специальные действия.

    А именно, каждый раз, перед запуском установки «для текущего пользователя» патчить msi-файл инсталлятора, устанавливая в «1» третий бит специального свойства «Word Count» в так называемом «Summary Information Stream» (который является неотъемлемой частью msi-файла). Для этого можно использовать функцию MsiSummaryInfoSetProperty(). Если msi-файл имеет цифровую подпись, то при установке в режиме «для всех пользователей» будет «синее» окошко UAC. При установке же в режиме «для текущего пользователя» факт испорченной цифровой подписи на UAC не влияет, поэтому такой подход прекрасно работает.

    Если же не использовать описанные выше шаманские танцы с бубном для Windows Vista, а просто установить третий бит в «1» во время сборки msi, то даже системный администратор не сможет установить такой msi в режиме «для всех пользователей» :-). И наоборот, если третий бит не ставить, то будет выводиться окошко UAC, а в худшем случае требоваться пароль администратора.

    Как упаковать?


    Для реализации перечисленных возможностей нужен exe-файл инсталлятора. В него уже упаковывается msi-файл. Движок пользовательского интерфейса также желательно выносить в exe, чтобы обеспечить не только переключение языка установки «на лету», но и выбор опций ещё до запуска msi-установки. Важно не забыть про взаимодействие с системой Windows Installer, обеспечить корректное обнаружение уже установленной версии и поддержку удаления. Корпоративный заказчик получает тот же msi-файл, что и упакованный в exe — ему не нужна поддержка ни portable-режима, ни установки для текущего пользователя, а язык указывается в командной строке.

    Чтобы разработать такой exe-инсталлятор, необходим опыт в разработке пользовательских интерфейсов, либо возможность использовать подходящий «фреймворк». Но вне зависиости от выбранных инструментов, понадобится глубокое знание WinAPI и API Windows Installer.

    И попробовать


    Бета-версия бесплатного Advanced IP Scanner, нашего маленького полигона по обкатыванию новых технологий на людях, обзавелась новым инсталлятором, который на деле реализует большую часть описываемых возможностей. И запуск без установки, и смена языка, и msi-файл внутри — всё в нём есть. Рекомендуется качать, смотреть и изучать. :-)

    Для выбора языка, отображения диалогов и запуска portable-версии мы использовали Inno Setup. Начинка (msi) осталась прежней, на WiX, только теперь без диалогов.

    Всем отважившимся увидеть живой инсталлятор «всё-в-одном» и принять участие в бета-тестировании, необходимо:
    1. Скачать Advanced IP Scanner 2.3.226 beta.
    2. Ознакомиться с продуктом.
    3. Проверить его совместимость с вашей ОС.
    4. Прислать нам баг-репорт и/или пожелания по улучшению через специальную форму на странице бета-тестирования.

    Каждый бета-тестер получит бессрочную лицензию на Radmin 3.

    Заранее благодарим за ваше участие. Вопросы разработчикам и комментарии приветствуются!
    Фаматек
    65,80
    Компания
    Поделиться публикацией

    Комментарии 114

      +4
      Инсталляторы это вообще бред. Программа должна быть одним файлом, который просто копируется в любое место на диске и нормально оттуда работает.
        +15
        Представляю себе MS Office или Photoshop одним файлом.
          –9
          Вы не поверите. Photoshop для Mac OS одним файлом.
            +19
            Вы не поверите, но это не файл, а App Bundle, что, по сути, означает папку
              0
              Уточню, что папка с расширением .app (хотя у папок конечно нету расширений).

              Сюда же вопрос: а что мешает упаковать всё содержимое в один файл, как делается в Portable-приложениях под Windows?
                –7
                С чего это у папок нет расширений? Я могу хоть 20 точек поставить и последняя часть и будет расширением:)
                Сюда же вопрос: а что мешает упаковать всё содержимое в один файл, как делается в Portable-приложениях под Windows?

                Вот это я не в курсе
                  0
                  С чего это у папок нет расширений?
                  Потому что расширение полностью называется расширением имени файла. Оно определяет тип/формат содержания файла и служит для определение какой программой файл обрабатывается. Для папки оно бессмысленно. Исключение составляет только .{GUID} в Windows, но оно работает только в пределах проводника (не видел файловых менеджеров, которые учитывают спец. папки) и не является «расширением» в первоначальном смысле.

                  Кстати, с вики «Расширение имени файла»:
                  В файловой системе FAT16 имя файла и расширение являлись отдельными сущностями, а точка, разделявшая их, реально не являлась частью полного имени файла и служила лишь для визуального отделения имени файла от расширения. В файловых системах FAT32 и NTFS точка стала обычным разрешённым символом в имени файла
                    +4
                    Как бы, папка это тоже файл, с установленным атрибутом папки.
                      0
                      Вы это серьезно? Вы серьезно рассуждаете о внутреннем устройстве файловых систем, когда я говорю о семантике слова «расширение»?
                        +5
                        Серьезно.
                        Изначально вопрос звучал как: «есть или нет у папок расширения». Ответ — есть, исторически так сложилось.
                        А то, что расширения у папок не несут глубокого смысла, как расширения у файлов — вопрос совершенно другой.

                        PS: Рассматривая это в контексте файловых систем и ОС от MS конечно же.
                          –1
                          Давайте еще раз. В контексте файловых систем FAT32 и NTFS расширений нету. Вообще
                          В файловой системе FAT16 имя файла и расширение являлись отдельными сущностями, а точка, разделявшая их, реально не являлась частью полного имени файла и служила лишь для визуального отделения имени файла от расширения. В файловых системах FAT32 и NTFS точка стала обычным разрешённым символом в имени файла
                          Т.е. реальной разницы между файлами/каталогами с расширениями и без расширений на нижнем уровне не делается. Различия появляются уже на уровне операционной системы, в которой .exe — это исполняемый файл, а .txt — это текстовый документ.
                            –1
                            И соответственно, поскольку системой не делается различий между каталогом papka.exe и каталогом papka.txt, то расширений у папок нет.
                              +2
                              Даже не знаю с чего начать.

                              Давайте с FAT16: Для папок можно создать имя 8+3 символа, как и для файлов — различий нет. И у файла и у папки есть расширение. Гуд.

                              Для FAT32 и NTFS: Если принять изложенные Вами факты и рассуждения, то таки да, у папок нет расширений. НО и у файлов их тоже тогда нет и ОС оперирует именем файла для определения его типа. Что является расходится с пониманием людей в повседневном использовании ПК (хотя и верно на физическом уровне). Будем ломать представление ни одной сотни миллионов пользователей об устройстве мира?
                                –1
                                Давайте забьет на FAT16, старье все-таки.

                                Для FAT32 и NTFS: Если принять изложенные Вами факты и рассуждения, то таки да, у папок нет расширений. НО и у файлов их тоже тогда нет
                                Верно, но с одной поправкой — на уровне файловой системы расширений нет ни у каталогов, ни у файлов, А на уровне операционной системы расширения есть только у файлов.
                                  0
                                  Вы это серьезно? Вы серьезно рассуждаете о внутреннем устройстве файловых систем, когда мы говорим о семантике слова «расширение»?
                                    0
                                    Слишком толсто, слишком тупо и вообще неправильно. Человек не захотел обсуждать семантику, мы спустились на уровень внутреннего устройства.
                                      0
                                      Я смотрю, вы в профиле в «О себе» всё честно написали. Добавьте ещё туда «Чувство юмора отсутствует, вежливость в зачаточном состоянии» :)
                                        0
                                        done ;-)
                      –1
                      Из Вики:
                      «Расширение имени файла (англ. filename extension, часто говорят просто расширение файла или расширение) — последовательность символов, добавляемых к имени файла и предназначенных для идентификации типа (формата) файла. Это один из распространённых способов, с помощью которых пользователь или программное обеспечение компьютера может определить тип данных, хранящихся в файле.»

                      У папок нет типов, никто не обрабатывает их по «буквам перед последней точкой», а значит и расширений у них нет.
                      +1
                      не, «как Portable-приложениях под Windows» не вариант… Так как этот один файл — это практически архив программы, который распаковывается при запуске. Так что это тормоза, выгодные только реально в тех местах, где эта программа нужна без установки. Для повседневки тяжеловато.
                    +25
                    Это не файл :(. Это папка, маскирующаяся под файл. И при «перетаскивании» в «Applications» она запускает кучу скриптов, которые делают кучу неочевидных действий. BTW, при перетаскивании в корзину она часть этих действий по техническим причинам откатить не может — поэтому если набрать в гугле заклинание «Photoshop MacOS uninstall» можно много интересного и увлекательного прочитать :).
                      0
                      при перетаскивании именно программы(и пофиг что на самом деле её можно штатно открыть как папку, пользователь делает дабл-клик, открывается программа) копируется только программа, ничего хитрого не происходит. Уже после запуска, сама программа создаёт кучу всякой фигни в application support и прочие папки.
                        +2
                        что насчёт photoshop. при всём моём уважении, парни вы сами то ставили его на мак? :) Adobe использует обычный инсталятор, как и в windows-версии. запутил, далее-делее-делее… :) именно он и раскидывает свой хлам где попало. это кстати очень напрягает, особенно учитывая то, что удаляется немного сложнее, чем обычно. не зря pixelmator так популярен ;)
                          +1
                          Сейчас инсталляторы используются. Раньше вся эта машинерия пряталась внутри папки .app
                          0
                          Не хотелось бы вдаваться в технические детали. Да, фактически при первом запуске — но это оттого, что на макоси долго инсталляторы не использовались.
                            0
                            Ну, если бы точным до конца, при перетаскивании приложения в папку /Applications системой могут быть выполнены некоторые действия. Например, запуск DockTilePlugIn или регистрация LoginItem этого приложения.
                            +2
                            Тем не менее для пользователя это выглядит именно так.
                          +1
                          Ну Скайп уж точно одним файлом. А все остальное в дистрибутиве — мусор. Всегда выковыриваю skype.exe, а все остальное сливаю в корзину.
                            0
                            Многим нужны дополнительные функции. Например, звонки из браузера по клику на соответствующей тэг. Это без инсталляции технически некорректно осуществить.
                              +1
                              Мне бы это отключить хотелось, да вот только всепролазящий скайп после обновлений все равно добавляет свои расширения в браузеры даже не спрашивая.
                              Достало…
                                0
                                Это уже вопрос к менеджерам Microsoft. Обычно инсталлятор при установке чекбоксами спрашивает, какую интеграцию и куда устанавливать. Но, увы, ничто не мешает разработчикам не справшивать пользователей о чем-нибудь :(.
                                  0
                                  Ну так делайте как я — выковыривайте из инсталлятора только файл skype.exe
                            +1
                            Вы не поверите (с). Именно о таких программах в статье и речь. Забавное совпадение, не правда ли?
                              +3
                              Скорее всего не файлом, в автономным пакетом. Вроде сборок portable или .app для OSX. Это удобно. Из минусов, навскидку, лишнее место на копии библиотек, фреймворков и прочих ресурсов, проблемы с их независимым обновлением (типа Явы какой-нибудь или Флеша), отсутсвие деинсталлятора с уборкой мусора из пользовательских каталогов, плохая интеграция с системой (PATH, контекстные меню, связки типов файлов — они могут быть установлены при первом запуске но вряд ли могут быть убраны автоматически при удалении автономного пакета).
                                +3
                                Вот лишние копии библиотек — спорный минус. В линукс я не раз сталкивался с тем что двум программам нужна одна и таже библиотека, но разных версий и это вызывало кучу проблем
                                  +1
                                  Верно, в Винде это также порождает проблему, известную как dll hell.
                                    0
                                    Порождало, сейчас против dll hell борется подсистема sxs, что впрочем не мешает пользователям пытаться её выковырять и отключить.
                                    0
                                    Для решения этой проблемы неплохо было бы иметь что-то вроде слотов из Gentoo.
                                  +1
                                  Представил себе как радостно будет работать с браузером, если он не будет устанавливаться, а тупо копироваться. Хочешь отрктыть ссылку — скопируй и вставь в браузер. Хочешь открыть файл — запусти браузер, нажми открыть файл — найди файл. Хочешь разных настроек для разных пользователей, ну так это за гранью добра и зла.
                                    0
                                    А опцию в настройках программы и изменение поведения runtime почему в таких случаях не запилить?
                                    +3
                                    Идеальный пример такой программы — µTorrent.
                                      0
                                      Нет проблем, возьми на вооружение VMware ThinApp )
                                      0
                                      попытка запуска под пингвином. Версия 2.2: спросило язык… и сдохло плюнув в консоль:
                                      err:cabinet:FDICopy FDIIsCabinet failed: 2.
                                        0
                                        К сожалению, в Wine программа не работает.
                                          +1
                                          А инсталлер-то почему не работает? Огромная куча MSIшек ставится без проблем.
                                            +2
                                            Потому что не тестировался в Linux :-)
                                              0
                                              Хорошо, щас 2.3 еще проверю и пойду спать :)
                                                0
                                                Спасибо :-)
                                                  +1
                                                  Попытка сразу запуска:
                                                  fixme:sfc:SfcIsFileProtected ((nil), L«C:\\users\\datacompboy\\Temp\\is-NK2V1.tmp\\log.txt») stub
                                                  fixme:storage:create_storagefile Storage share mode not implemented.

                                                  Попытка «установить» — распаковалась MSI, молча поставилась, сканнер запустился.
                                                  При сканировании — помер :)

                                                  Щас скину если интересно лог в БТ.
                                                    +1
                                                    Киньте, пожалуйста, стектрейс. Но скорее всего в wine не имплементирована какая-нибудь специфичная функциональность windows, которая используется для быстрого сканирования. Хотя есть варианты.
                                                      +1
                                                      Собственно да:
                                                      wine: Call from 0x7b83bb52 to unimplemented function mgmtapi.dll.SnmpMgrOpen, aborting
                                                      wine: Unimplemented function mgmtapi.dll.SnmpMgrOpen called at address 0x7b83bb52 (thread 0044), starting debugger…

                                                      и ARP проблема тоже, думаю, вылезет:
                                                      fixme:iphlpapi:SendARP (DestIP 0x0f011cac, SrcIP 0x00000000, pMacAddr 0xa2ce4ac, PhyAddrLen 0xa2ce4a0): stub

                                                        0
                                                        Ну а под Windows нету Raw sockets (условно) :(. Так что тут пока безвыходная ситуация ^_^.

                                                        С другой стороны, под никсами хорошо развита инфраструктура сетевых утилит и есть много альтернатив. Так что кросс-платформенная версия пока не горит.
                                                          0
                                                          Зато инсталлятор стал корректно работать :) уже прогресс!
                                                            0
                                                            Естественно — мы же дотнетовский «dotnetinstaller» поменяли на вполне себе продакшн «innosetup» — феншуй и все дела.
                                        +17
                                        Пакетные менеджеры. Остальное не нужно.
                                          0
                                          К сожалению, в Windows другие стандарты…
                                            +1
                                            Если сервер — то WEB PI. Мы почти полностью избавились от инсталяторов. Пакеты и PowerShell =)
                                              0
                                              Web PI, так же как и NuGet — штуки сами по себе хорошие, но несколько далекие от установки desktop приложений для конечных пользователей. Вот выйдет Windows 8 с маркетом — будем обкатывать его «пакетный менеджер» :).
                                            +4
                                            Только исходники, только хардкор.
                                              0
                                              Существуют ли пакетные менеджеры которые могут поддерживать две разные версии одно библиотеки или программы?
                                                0
                                                А зачем? Для этих целей есть разные ветки.
                                                  0
                                                  Две разные ветки чего? Я хочу установить программу A, которая требует библиотеку C версии X и программу B, которая требует библиотеку C версии Y.

                                                  Мне интересно, какие пакетные менеджеры умеют справляться с такими ситуациями
                                                    +2
                                                    Такая ситуация — стандартна для пакетных менеджеров. Никаких особых сложностей она не вызывает.

                                                    В системе прекрасно могут уживаться несколько версий gcc или там python'а с соответствующими библиотеками.
                                                      0
                                                      Так всё же, как называется этот пакетный менеджер. Некоторое время назад я пользовался aptitude и он этого не умел. Хотя может и умел, да сборщики дебиан не умели собирать пакеты
                                                        +1
                                                        dpkg. Он это умеет.
                                                          0
                                                          pacman в Arch тоже не испытывает с этим проблем ( если автор пакета не криворук, конечно :) )
                                                      0
                                                      Например, в программу встроена поддержка интерпретатора Perl как разделяемой библиотеки, что требует точного совпадения версии Perl API в libperl. Если в системе более новая версия Perl, то может появится необходимость в одновременной установке двух пакетов Perl (откат установленной версии может привести к печальным последствиям).
                                                      0
                                                      Тот, что в Slackware не так чтобы справляется, ему просто всё равно при инсталяции (для обновления используется отдельная команда). Хотя, при удалении пакета он не удалит файл, если он всё ещё используется каким-нибудь пакетом; как в такой ситуации поступит apt или что-то другое — не знаю. Но это если использовать его напрямую (то есть installpkg), тот же slackpkg ругается на два пакета одинаковой версии.
                                                        0
                                                        Да, кстати, тоже интересно, могут ли пакетные менеджеры держать в системе несколько версий библиотек. Или же для обратной совместимости, надо будет программу упаковывать «все в одном»?
                                                          0
                                                          Могут.
                                                          +2
                                                          Существует, emerge из Gentoo, соответствующий механизм называется «слоты»; например, можно одновременно иметь python версий 2 и 3.
                                                          Кроме того, dpkg-шный update-alternatives вроде бы предназначен именно для этого.
                                                        +27
                                                        оффтоп про инсталляторы:

                                                        Вчера ставил себе на новый комп StarCraft II

                                                        скачал инсталлятор (< 2мб), запустил, сижу в носу ковыряю, жду.
                                                        скачалось около 10%. смотрю, кнопка «Играть» подозрительно активного цвета.
                                                        жму — и играю О_о
                                                        даже миссию попробовал запустить. она подумала чуток, чего-то там докачала и запустилась.

                                                        вот такие инсталляторы меня крайне радуют.
                                                          –3
                                                          Это еще в вове вкрутили=) весьма прикольно, иногда правда стены прозрачные во время подкачки=).
                                                            +7
                                                            Это практически их ноу-хау, насколько я помню они первое такое массово ввели. Но это они от безысходности — мало кто готов ждать пока скачается 10+ гигабайтный установщик, чтобы поиграть в триал версию с полутора локациями.
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              0
                                                              новый офис также запускается через пару минут после запуска 5-мегабайтного файла установки.
                                                              +6
                                                              Нужная фича в инсталляторах — неактивной по умолчанию чекбокс «Установить Яндекс.Бар» :)
                                                                +4
                                                                Лучшая фича в инсталляторах — это отсутствие оных :)
                                                                  +2
                                                                  Совместно с отсутствием установленных баров после.
                                                                0
                                                                А можно детальнее про то как реализована portable версия программы?
                                                                Раз у вас на каком то этапе используется msi, то это подразумевает регистрацию компонентов в реестре. Каждый компонент(в WIX'e тег Component) отдельно регестрируется в реестре для корректного обновления/удаления.
                                                                  0
                                                                  Мы извлекаем msi и выполняем его административную установку во временную папку — это позволяет использовать нативные средства распаковки Windows Installer. Никакие компоненты при этом в системе не регистрируюстя.

                                                                  Я раньше никак не мог вкурить, для чего нужна эта административная установка. А тут, в работе над новым инсталлятором, открылось сие тайное знание :-)

                                                                  msiexec.exe /a <путь к msi> /qn TARGETDIR=<куда распаковывать>
                                                                    +1
                                                                    Административная установка кроме всего прочего нужна для того, что бы можно было пропатчить MSI-инсталляцию с помощью MSP (или нескольких), и потом устанавливать уже пропатченный продукт. Намного удобнее чем ставить а потом патчить. А ещё некоторые системы разворачивания (например HP OpenView aka Radia) требуют только админустановку.
                                                                      +1
                                                                      Вот оно как оказывается :) А то я как то наткнулся в help'e msiexec
                                                                      на строчку
                                                                      /a <Product.msi> Administrative install — Installs a product on the network
                                                                      и в дальнейшем исходил из того что это некий специфический способ установки по сети. Да и в msdn'e как то невнятно написано, что это.
                                                                        0
                                                                        Разработчикам туго без системных администраторов :-)
                                                                        0
                                                                        Очень удобная штука, спасает от навязчивых производителей драйверов, которые впихивают свои дебильные утилиты, например для поиска вай-фай сетей или выбора эквалайзера. Как правило эти утилиты обладают совершенно шизофреническим интерфейсом и используются единожды: «О, эт чо за фигня? Так, понятно...»

                                                                        Иногда разработчики пишут свои инсталляторы, чем делаю меня плакать :-)
                                                                          0
                                                                          Ой, ниже более развернуто обсуждали.
                                                                            0
                                                                            Произвоидтели драйверов часто прописывают свои дебильные утилиты прямо в inf-файлах, модификация которых приводит к потере ЦП и отказе при установке.
                                                                        +11
                                                                        У меня шесть лет опыта системного интегратора именно в изготовлении и/или затачивании MSI и не-MSI инсталляций для MS SCCM, HP OpenView, IBM Tivoli, а также для кучи самописных систем-«велосипедов» заказчика. За это время через мои руки прошло около трех сотен различных инсталляций. И вот что я, опираясь на этот опыт, скажу.

                                                                        Уважаемые товарищи разработчики!

                                                                        Если Ваше приложение планируется (хотя бы в перспективе) разворачивать в корпоративных сетях — не пишите никаких своих инсталляторов! Не надо, пожалуйста, я от имени всех системных интеграторов Вас очень прошу! Выучите уже наконец обыкновенный стандартный MSI и его штатными средствами сделайте обыкновенную нормальную MSI-инсталляцию! Без хитрых custom actions, без навороченных обёрток со своими командными строками, без InstallShield внутри. Если сами не умеете — доверьте это дело профессионалам, которые занимаются развёртыванием продуктов в корпоративных сетях. Честное слово, они лучше знают как надо это делать!

                                                                        Со всем уважением, искренне ваши, системные интеграторы.

                                                                        Извините, за шесть лет накипело.
                                                                          +1
                                                                          Полностью согласен! Это именно то, на что нужно ориентироваться. Мы сначала делаем правильный MSI, тестируем его, и только потом заворачиваем в exe. Но хоть мы и выучили уже досконально стандартный MSI, всё равно находятся новые нюансы.

                                                                          Вот скажите, MSI, предназначенный для развёртывания в корпоративных сетях, должен иметь диалоги установки или нет?
                                                                            +2
                                                                            Большинство клиентов, с которыми работала моя команда, предпочитали инсталляции без диалогов. Также практически все крупные клиенты (от 10 тыс. машин в филиалах по всему миру) предпочитали чистый не загаженный никакими авторскими примочками MSI. Обычный MSI, сделанный стандартными средствами, который можно запихнуть в conflict management system и сделать components conflict resolving, который без проблем ставится например MS SCCM, которые не даёт туеву хучу ошибок при валидации стандартным CUBом орки. И который легко кастомизировать через Property (хоть трансформом, хоть с командной строки). И который можно поставить из-под Local System, что в случае InstallShield иногда превращается в дикий геморрой. Вот что надо корпоративным клиентам.
                                                                              0
                                                                              А не подскажете, что из себя представляет components conflict resolving?
                                                                              На счёт Local System отлично подмечено ;-)
                                                                                +1
                                                                                Объясню на примере. Допустим есть компонент A с гуидом {A} в файле A.msi, и компонент компонент B с уже другим гуидом {B} в файле B.msi. Оба компонента, и A и B, ставят некую библиотеку X.dll в C:\Windows\System32 (на самом деле это частая ситуация — программы доставляют нужные им версии системных библиотек, всякие comctl и т.п.).

                                                                                Теперь давайте представим что система разворачивания делает с файлами A.msi и B.msi следующее:

                                                                                1. Устанавливает A.msi. В результате компонент A установился и зарегистрировался в системе, а библиотека X.dll стала в C:\Windows\System32. Пока все довольны.
                                                                                2. Устанавливает B.msi. В результате компонент B установился и зарегистрировался в системе. Библиотека X.dll по прежнему в C:\Windows\System32. Пока все всё ещё довольны, но это уже не надолго.
                                                                                3. Удаляет A.msi. В результате разрегистрируется и удаляется компонент A и, поскольку отмечено что этому компоненту принадлежит библиотека X.dll — удаляется и эта библиотека тоже! Windows Installer плевать что эта библиотека принадлежит еще и компоненту B. И вот тут все становятся несчастными…
                                                                                4.… потому что при запуске приложения, которое было поставлено B.msi, это приложение не находит нашу X.dll и работать отказывается.

                                                                                Если инсталляция B.msi сделана правильно и доступна в системе во время запуска приложения — начнется self healing, который восстановит библиотеку X.dll. Но даже если B.ms сделана как надо, self healing возможен не во всех системах разворачивания — например в той же HP OpenView нас ждёт облом, т.к. B.msi будет просто недоступна, в силу архитектуры самой системы. В результате на паре тысяч машин не запустится какое-то ПО. Если это Блокнот, то фиг с ним. А если это система обслуживания клиентов в банке у операторов?

                                                                                Что бы такой фигни не происходило, нужно синхронизировать гуиды компонентов A и B. Тогда произойдёт следующее:

                                                                                1. Система разворачивания устанавливает A.msi. В результате компонент A установился и зарегистрировался в системе, а библиотека X.dll стала в C:\Windows\System32.
                                                                                2. Устанавливает B.msi. У компонента B тот же гуид что и у A. В результате у компонента A просто увеличился счетчик количества установок. Библиотека X.dll по прежнему в C:\Windows\System32.
                                                                                3. Удаляет A.msi. В результате счетчик установок компонента A уменьшился на один. Сам компонент не удалился, библиотека X.dll на месте!
                                                                                4. При запуске приложения, которое было поставлено B.msi, это приложение находит нашу X.dll и нормально стартует. Все довольны, все смеются.
                                                                                  0
                                                                                  Спасибо, Вы привели одно из самых понятных на русском языке объяснений таинственных Component Rules!
                                                                                    0
                                                                                    Ну на самом деле это простейший случай конфликта: один и тот же файл ставится двумя MSI инсталляциями, причем компонентами с разными гуидами. И решение конфликта тут тоже элементарное: назначить компонентам одинаковые гуиды, и всё. За свою практику я наблюдал конфликты намного более замысловатые :)

                                                                                    Вообще dependecy & conflic management — это тот ещё хитрый геморрой. Зато если всё делается как надо, то у заказчика может быть хоть по триста приложений на каждой из его десятков тысяч машин включая банкоматы и сервера — всё равно всё работает гладко и не лагает.
                                                                                      0
                                                                                      * dependency & conflict management конечно же… чего-то я устал под конец дня, извините.
                                                                                        +1
                                                                                        Дмитрий, а может пару статей по обширному опыту? По развертыванию, да кровавому энтерпрайзу?
                                                                                          0
                                                                                          Прямо сейчас не могу — пишу статью про отладку native методов без исходных кодов под Android. В интернете про это на русском ничего, на английском скудно, на китайском побольше — но мой китайский очень плох :)

                                                                                          Как закончу — можно будет и про «кровавый энтерпрайз» вспомнить :)
                                                                                +1
                                                                                >Вот скажите, MSI, предназначенный для развёртывания в корпоративных сетях, должен иметь диалоги установки или нет?

                                                                                В процессе развертывания диалоги обычно не используются, за ооочень редкими исключениями. Но если диалоги в MSI-файле уже есть, при необходимости их можно отключить одним параметром командной строки. Отдельный MSI-файл только для этих целей делать нет смысла.
                                                                                Уточню, что я имею в виду диалоги, реализованные средствами MSI, а не сторонними средствами.
                                                                                +2
                                                                                Самое печальное, что даже Microsoft не всегда делает нормальные MSI установщики.
                                                                                  +3
                                                                                  Таки да! Microsoft — разработчики стандартов Windows Installer — в большинстве случаев сами этих стандартов не придерживаются. Пичалька, огорченьице, гневик…
                                                                                0
                                                                                чем меньше разновидностей инсталляторов, тем предсказуемее установка.
                                                                                  0
                                                                                  А как же mail.ru Агент?
                                                                                    0
                                                                                    А можно чуть подробнее про то, как использовать административную установку для запуска портабельной версии?
                                                                                    В двух словах, как это делается.
                                                                                      +3
                                                                                      Если выполнить
                                                                                      msiexec.exe /a %путь_к_msi% /qn TARGETDIR=%куда_распаковывать%
                                                                                      то в папке %куда_распаковывать% мы получим структуру каталогов, которые могут повторять структуру каталогов в %ProgramFiles%\%папка_продукта%. A могут и не повторять — зависит от того что записано в таблице Directory в MSI файле. В результате, если программа имеет возможность запуститься как Portable — её можно запустить из папки %куда_распаковывать%. Но для этого нужно что бы
                                                                                      * программа могла запускаться как Portable
                                                                                      * MSI не должна содержать custom actions без которых программа не ставится и не работает потом нормально (т.к. во время админустановки они не выполняться)
                                                                                      * MSI должна быть правильно сделана — например такая MSI как у инсталлятора JAVA работать на будет, т.к. внутри там один большой архив который распаковывается с помощью custom action
                                                                                      Я так понимаю MSI инсталляция которая обсуждается в данном конкретном случае — работает после админ. установки.
                                                                                        0
                                                                                        благодарю, смысл понятен
                                                                                      0
                                                                                      Хотите установить Яндекс.Бар?
                                                                                      /rage
                                                                                        0
                                                                                        >Каждый бета-тестер получит бессрочную лицензию на Radmin 3.

                                                                                        Извините за придирке, но на сайте указано, что получат лишь те, кто найдет существенную ошибку — кому верить? :)
                                                                                          0
                                                                                          придирки* конечно же, был напуган )
                                                                                            0
                                                                                            Ну, рассинхронизованность документации и кода — извечная проблема разработчиков :-)
                                                                                              0
                                                                                              Каждый бета-тестер, который заполнит форму по правилам, получит бесплатно лицензию на Radmin :)
                                                                                                0
                                                                                                Разве голосование уже закончилось? Сейчас нам сольют карму )))
                                                                                              0
                                                                                              Так в TeamViewer такой функционал уже несколько лет есть. Варианта два, или запустить и сразу получить ID к сессии, или установить на комп.
                                                                                                0
                                                                                                Так мы как раз у них эту идею и стырили :-)
                                                                                                  0
                                                                                                  Не, коллега, это не тыринг, это догоняющее развитие:) И вообще, когда уже будет что-то новое, интересное, с 2009 ничего не появлялось по Radmin'у, только айпи сканнеры и прочее. Радмин крут, но все же сам пользуюсь RDP, не хватает фичи вот этой, про которую говорим вот.

                                                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                              Самое читаемое