Всем привет! Сегодня научимся создавать msi-установочник для плагина. Больше никаких "просто скопируй файлы в нужную директорию", "просто замени dll". Просто переустанови новую версию msi и всё.
WixSharp
Для этого воспользуемся фреймворком WixSharp. Это библиотека, которая позволяет собирать установочный файл в формате msi, с довольно большим набором дополнительных настроек. В данной статье мы разберём только базу: как сделать файл, при запуске которого в нужных папках появятся нужные dll и addin-файлы.
Подготовка
Я буду использовать свой любимый плагин из этого репозитория. Что там за плагины, можно почитать в подборке.
Я модифицирую addin-файл, чтобы он ссылался не просто на dll, а на dll во вложенной папке. Смысл тут такой: если проект усложнится и там будет много файлов, мы не будем засорять папку для addin-ов и плагинов, а положим всё в одно место.
WixSharp представляет из себя консольное приложение, которое собирает нам установочник. Поскольку наш проект является библиотекой классов, создадим новый проект в составе существующего решения с плагином на шаблоне "Консольное приложение .NET Framework":
Установим nuget-пакеты WixSharp.bin и WixSharp.wix.bin в новый проект:
Далее заполним метод Main так:
Давайте разберёмся:
- Строка 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 проекта в нашем решении. Жмём правой кнопкой на решение и идём в его Свойства:
Нам нужно создать новую конфигурацию:
В конфигурации Build у нас запускаются оба проекта, а в конфигурации основного проекта Build не собирается. Настроим это, меняя активные конфигурации в этом окне:
И в свойствах поставим запускаемый проект Build:
Далее в свойствах поставим конфигурацию Build и запустим проект:
Важное примечание из комментариев от Ильи Жаркова:
При изменении плагина меняйте версию (строка 17), тогда новый msi будет перезаписывать старый для системы (не надо будет сначала удалять программу, чтобы установить новую версию).
В папке проекта Build появится папка output и msi-файл:
Если запустить его, то в папке для надстроек Ревита появится папка нашего плагина со всеми перенесёнными файлами, и addin-файл. Плагин установился.
Ссылка на итоговый репозиторий с установочником
На сегодня всё. Можете попробовать всё это самостоятельно, задавайте вопросы, если что-то не работает. Так же делитесь мыслями, если у вас получилось сделать установочник фреймворком WixSharp круче. До новых встреч!