Нет времени и желания изучать километровые файлы WiX, чтобы собрать MSI инсталлер для своего проекта, погружаясь при этом в бездны MSDN? Хотите собирать инсталлер, описывая его простыми и понятными терминами, в несколько строк? Есть клиническая склонность к кроссплатформенности и сборкам под Linux & Docker? Ну тогда вам под кат!


Разработчики поневоле


Собственно говоря, именно с этими "хотелками" наш проект кросс-платформенного редактора векторной графики и столкнулся пару месяцев назад.


Мы знали про WiX Toolset (Windows Installer XML), но даже беглый просмотр туториалов на официальном сайте навевал грусть и уныние — без серьезного погружения в XML описания инсталляторов не обойтись. Использовали более простой MakeMsi, но в нем была масса недоработок. И опять же, все эти инструменты не годились для сборки MSI под Linux.


Поиски привели к проекту wixl, который собирал MSI в Linux, но страдал серьезной недоработкой по функционалу и требовал те же XML файлы чудовищных размеров, что и WiX.


В результате, чтобы обзавестись нужным инструментом для сборки, мы переимплементили логику wixl на python, исправив многие недочеты и добавив необходимый функционал, и сделали проект кроссплатформенным. Так и появился WIX.Py — сборщик MSI с весьма низким порогом вхождения.


Как WiX.Py работает


Процесс создания MSI пакета упрощен до предела:


  1. В произвольной папке (напр. build) формируем содержимое для инсталляции в том виде, в котором оно будет на целевом компьютере.


  2. Заполняем небольшой JSON-файл. Например:


    {
    "Name": "MyApp",
    "UpgradeCode": "3AC4B4FF-10C4-4B8F-81AD-BAC3238BF690",
    "Version": "0.1",
    "Manufacturer": "My Company",
    "Description": "MyApp 0.1 Installer",
    "Comments": "Licensed under GPLv3+",
    "Keywords": "wxs, xml, build",
    "Win64": true,
    "_CheckX64": true,
    "_AppIcon": "resources/myapp.ico",
    "_ProgramMenuFolder": "My Company",
    "_Shortcuts": [
        {"Name": "MyApp",
        "Description": "MyApplication",
        "Target": "myapp.exe",
        "AddOnDesktop": true,
        "OpenWith": [".xml", ".wxs", ".yml"]
        }
    ],
    "_SourceDir": "build/",
    "_InstallDir": "myapp-0.1",
    "_OutputName": "myapp-0.1_win64.msi",
    "_OutputDir": "./"
    }

  3. Генерируем MSI пакет командой:


    wix.py <имя_файла>.json


Да, это полностью рабочий пример MSI пакета, который проверит перед установкой, что Windows 64bit, установит приложение в Program Files, добавит приложение в программное меню и на рабочий стол, и привяжет указанные форматы файлов к устанавливаемому приложению. Никакой магии и шаманства с регистром.


Можно еще больше сократить пример до 5-6 строк, но тогда функционал инсталлятора будет ну совсем куцый.


Используя WiX.Py, cборку MSI можно проводить как в Windows, так и в Linux, в т.ч. в Docker-контейнерах. Поскольку базовая libmsi может быть собрана на многих других UNIX-системах (напр. macOS), формально WiX.Py можно и на них использовать, только практического смысла это не несет.


Описание различных нюансов вы можете найти в документации проекта.


Заключение


Если вам подходит WiX.Py для решения задач по созданию MSI пакетов, но не хватает какого-либо функционала, заходите на наш сайт https://wix.sk1project.net и создавайте запрос на расширение функционала. Тоже самое касается обнаруженных багов — сообщайте и мы будем с ними бороться. Там же на сайте найдете исходный код и готовые пакеты для разных платформ.


Если присутствует желание сравнить с WiX, то на Хабре уже не раз были статьи, посвященные WiX: 1, 2, 3, 4.

Комментарии (18)


  1. mapron
    22.09.2018 18:08
    -1

    Использовал CPack/WiX, никаких значительных траблов не замечал, все раскуривается за день-два.
    Бегло проглядел вашу доку, не нашел быстро ответа — как кастомные WiX файлы прикручивать к JSON?


    1. sk1project Автор
      22.09.2018 18:53

      Один-два дня — это только на первичный разбор технологии. Чтобы реализовать все нюансы, требуется гораздо больше. Касательно кастомных файлов — никак не прикручиваются. Инсталляционную директорию приложение сканирует самостоятельно. А UI пока еще не прикрутили — в разработке он. Но планируется, что он будет из готовых темплейтов. Или у Вас какой-то другой тип файлов?


      1. mapron
        22.09.2018 19:19

        Как раз если мне нужны нюансы, а не «быстрый конструктор» — я пойду писать исходные xml-файлы, имхо. Если инструмент не позволяет спуститься на уровень ниже в абстракции для тонкой настройки — с ним что-то не так.
        Не очень понял про UI.
        Я использовал кастомный WiX модуль, для вызова определенных утилит в нужные моменты установки. Возможно, в дальнейшем мне что-то еще понадобится. Кастомный UI из предустановленных темплейтов это конечно здорово, но я бы хотел полного контроля над тем, что там генерится. В идеале я бы конечно хотел контроля еще и над тем что сам WiX candle генерит, но это уж совсем мечты)
        Просто преимуществ пока я не вижу вашего решения перед CPack. Ну разве что «няшный json, а не богомерзкий cmake», тут да, не поспоришь)


        1. sk1project Автор
          22.09.2018 21:05

          • cpack на Linux не собирает MSI пакеты. Мы делали прежде всего под свои нужды, чтобы весь флоу сборки можно было гонять в CI без привлечения виндового инстанса. А при необходимости, собирать на локальном хосте в докере.
          • Сабж — быстрый конструктор для мелких и средних кроссплатформенных проектов аля Inkscape, Gimp и наши sK1/UniConvertor. А энтерпрайз может себе позволить и роскошный CI и отдельного спеца по инсталлеру. Мы не противопоставляем проект WiX — это скорее его упрощенная интерпретация.
          • Опуститься в WiX.Py можно на самый базовый уровень msi.dll — гораздо глубже, чем у WiX. Питон — интерпретируемый язык. Ставьте через PyPI и у вас будет доступен питонский пакадж wixpy — наследуйтесь, модифицируйте как фантазия пожелает. Вплоть до записи в БД msi пакета.


          1. mapron
            23.09.2018 13:08

            Хорошо, спасибо большое за развернутый ответ, сохранил!


  1. Sleuthhound
    22.09.2018 19:11

    Сделайте возможность установки в произвольную папку, не только в «Program Files», очень нужно. Даже стал бы пользоваться для сборки простых MSI. Удачи проекту.



  1. ioppoi
    22.09.2018 23:16

    спасибо


  1. Antervis
    23.09.2018 01:09

    Qt Installer Framework как раз то что нужно — кроссплатформенный фреймворк для создания инсталляторов, разве нет?

    А вообще распространять софт под linux/mac виндоподобными инсталляторами не кошерно


    1. caduser
      23.09.2018 09:18

      А вообще распространять софт под linux/mac виндоподобными инсталляторами не кошерно


      В статье речь идёт о сборке, а не распространении.


    1. sk1project Автор
      23.09.2018 09:18

      Боже упаси )) Сабж позволяет под никсами собирать кроссплатформ под винду. Пример сборки. Одной командой в докере «пекутся» инсталляторы под все поддерживаемые системы, в т.ч. и MSI. Ведь это все по сути просто пакеты, а не исполняемые файлы.


    1. mapron
      23.09.2018 13:10

      Скажите честно, вы сами поставляли продукт на основе QIF, у вас есть ссылка где его скачать можно?
      У меня после ковыряние с ним сложилось впечатление, что кроме инсталлятора самого Qt из него ничего сложного сделать нельзя.


      1. Antervis
        23.09.2018 13:27

        использовали для пары внутренних проектов, онлайн/оффлайн установка + обновлятор. Ссылку дать не могу. Какого именно функционала вам не хватило?


  1. sborisov
    23.09.2018 12:53

    А умеете ставить службы? Если программа должна работать, как виндовая служба?


    1. sk1project Автор
      23.09.2018 13:18

      В текущей версии такой функционал не проэкспонирован. Но можем и такое сделать. Фичереквест заводить? :)


  1. saipr
    24.09.2018 18:18

    Красивая и полезная вешь. Но, к сожалению, не смог запустить для Python3. От python2 пришлось отказаться так как под Windows он далеко не так хорош как для Linux. Может у вас всеже есть wix.py для Python3. Спасибо.


    1. sk1project Автор
      24.09.2018 19:24

      Вы можете установить через pip и на py3. Только вам придется использовать как питонский пакет. exe'шники для py3 сделаем на следующую версию.


      1. saipr
        24.09.2018 21:03

        Спасибо