Найти тему

Создание установочного файла для плагина

Оглавление

Всем привет! Сегодня научимся создавать msi-установочник для плагина. Больше никаких "просто скопируй файлы в нужную директорию", "просто замени dll". Просто переустанови новую версию msi и всё.

WixSharp

Для этого воспользуемся фреймворком WixSharp. Это библиотека, которая позволяет собирать установочный файл в формате msi, с довольно большим набором дополнительных настроек. В данной статье мы разберём только базу: как сделать файл, при запуске которого в нужных папках появятся нужные dll и addin-файлы.

Подготовка

Я буду использовать свой любимый плагин из этого репозитория. Что там за плагины, можно почитать в подборке.

Я модифицирую addin-файл, чтобы он ссылался не просто на dll, а на dll во вложенной папке. Смысл тут такой: если проект усложнится и там будет много файлов, мы не будем засорять папку для addin-ов и плагинов, а положим всё в одно место.

WixSharp представляет из себя консольное приложение, которое собирает нам установочник. Поскольку наш проект является библиотекой классов, создадим новый проект в составе существующего решения с плагином на шаблоне "Консольное приложение .NET Framework":

Установим nuget-пакеты WixSharp.bin и WixSharp.wix.bin в новый проект:

-2

Далее заполним метод Main так:

-3

Давайте разберёмся:

  • Строка 22 — имя проекта. Имеется в виду имя wix-проекта
  • UI — что будет отображаться в установочнике. Я выбрал минимальный вариант. ПО умолчанию можно менять лицензионное соглашение, обложку установочника. Судя по информации с гитхаба WixSharp, можно и свой кастомный дизайн окна сделать.
  • GUID — случайный GUID для системы
  • MajorUpgrade — эта настройка будет перезаписывать старые версии, если мы будем увеличивать номер
  • Manufacturer — что будет написано в свойствах нашей dll

Со свойством Dirs разберёмся подробнее:

  • Нам необходимо указать путь к папке, не привязанный к имени пользователя, поэтому в InstallDir мы указываем константу %AppDataFolder%. Для меня она заменится на C:\Users\Sergei Nefyodov\AppData\Roaming, для остальных устанавливающих этот msi — на аналогичный.
  • Внутри InstallDir мы копируем один файл (addin) — тут можно указать путь, ведь он запаковывается вместе с msi
  • И одну папку, в которую мы передаём DirFIles — все наши файлы из bin/Debug.

Примечание:
Да, в статье о подключении плагина я пишу о том, что файлы надо класть в другой адрес: C:\ProgramData\Autodesk\Revit\Addins\2023. На самом деле, так можно и в установочнике написать, всё будет работать. Разница в том, что в той статье мы установили плагин для всех пользователей данного ПК, а сегодня — для запускающего пользователя. В большинстве случаев разницы не будет, но это надо учитывать.

Настройка конфигураций

Теперь у нас 2 проекта. Нужно настроить 2 конфигурации, чтобы при запуске Build создавался msi, а не шёл запуск ревита или ошибка "Библиотека классов не может быть непосредственно запущена".

Мы создали 2 проекта в нашем решении. Жмём правой кнопкой на решение и идём в его Свойства:

-4

Нам нужно создать новую конфигурацию:

-5

В конфигурации Build у нас запускаются оба проекта, а в конфигурации основного проекта Build не собирается. Настроим это, меняя активные конфигурации в этом окне:

-6

И в свойствах поставим запускаемый проект Build:

-7

Далее в свойствах поставим конфигурацию Build и запустим проект:

Важное примечание из комментариев от Ильи Жаркова:
При изменении плагина меняйте версию (строка 17), тогда новый msi будет перезаписывать старый для системы (не надо будет сначала удалять программу, чтобы установить новую версию).

-8

В папке проекта Build появится папка output и msi-файл:

-9

Если запустить его, то в папке для надстроек Ревита появится папка нашего плагина со всеми перенесёнными файлами, и addin-файл. Плагин установился.

Ссылка на итоговый репозиторий с установочником

На сегодня всё. Можете попробовать всё это самостоятельно, задавайте вопросы, если что-то не работает. Так же делитесь мыслями, если у вас получилось сделать установочник фреймворком WixSharp круче. До новых встреч!

Мой телеграм-канал

-10