Проверка без пересборки образа
Образ собирается в CI и занимает много времени. Чтобы проверить плагин, пересобирать образ не нужно: достаточно собрать плагин в контейнере и положить файлы туда, откуда его подхватит программа.
Цикл разработки#
- Соберите плагин в контейнере с зависимостями.
- Скопируйте результат туда, где его найдёт Tuner или Niti.
- Перезапустите программу и посмотрите на результат в живом интерфейсе.
- Повторите.
Плагин Tuner#
Tuner подхватывает пользовательский каталог вместе с системным, поэтому права администратора не нужны:
mkdir -p ~/.local/share/tuner/plugins
cp build/src/libtuner-hello.so build/data/tuner-hello.plugin ~/.local/share/tuner/plugins/
pkill tuner; tuner &Если у системного и пользовательского плагина одинаковый Module=, возможно дублирование. Для проверки новой версии уже установленного плагина используйте временную запись в /usr, как ниже.
Виджет Niti#
Панель ищет виджеты в /usr/lib64/niti/widgets/. На неизменяемой системе он доступен для записи только временно:
sudo bootc usr-overlay
sudo cp build/src/libniti-hello.so /usr/lib64/niti/widgets/
sudo cp build/data/hello.plugin /usr/lib64/niti/widgets/
sudo cp ../data/default_settings.json /usr/lib64/niti/widgets/niti-hello.default_settings.json
systemctl --user restart niti.servicebootc usr-overlay делает /usr записываемым до перезагрузки: всё исчезнет само, система остаётся целой. Это безопасный способ экспериментировать. Затем добавьте модуль в зону ~/.config/niti-vala/panel.json и посмотрите на панель.
Запуск Niti в контейнере поверх живой сессии#
В репозитории NitiVala есть dev-run.sh: он запускает панель из собранного в контейнере кода и показывает её в вашей текущей сессии niri. Так можно править исходники и сразу видеть результат, не трогая установленную панель.
podman build -t niti-vala-dev -f Containerfile .
./dev-run.shПроверка при установленных зависимостях#
Если собираете проект Vala, запускайте проверки из контейнера, а не на хосте. Для NitiVala полный локальный прогон выполняет scripts/check.sh: сборку, тесты pytest и проверку служб. Для проверки памяти:
MESON_SANITIZE=address,undefined bash build.sh
python3 -m pytest tests/ -q
scripts/memcheck.shТесты#
Каждая новая механика получает тест. Для проектов на Vala удобно проверять через GI-привязки: pytest с gi загружает собранные библиотеки. У плагинов Tuner тесты лежат в каталоге tests/.
Чек-лист по памяти и безопасности#
Vala легко прячет утечки в замыканиях. Перед отправкой кода проверьте:
- таймеры (
GLib.Timeout), подписки на сигналы, мониторы файлов и D-Bus-подписки снимаются при уничтожении объекта; - в методах экземпляра замыкания не держат
thisсильной ссылкой (локальныйweak self = thisв valac 0.56 не всегда спасает, смотрите линтер NitiVala); - чтение пути от внешнего кода проверяет тип файла и ссылку;
- нет разбора числа через
int64.parse()без проверки ошибки; - нельзя менять массив, по которому идёт
foreach; - при ошибке разбора JSON не пишутся пустые настройки поверх пользовательских.
Грабли Vala и GTK4#
Gtk.Picture.for_pixbuf (...)это конструктор: нуженnew.- У
string[]нетsort, используйтеGLib.GenericArray. FileUtils.get_contentsбросает исключение, а не возвращаетbool: нуженtry/catch.Object.set_data<T> (key, null)требует nullable-типа:set_data<Gtk.Widget?>.
Перевод и локаль#
Если плагин переводится через gettext, собирайте с --prefix=/usr и ставьте .mo в /usr/share/locale/ru/LC_MESSAGES/. Для собственных плагинов без po/ это не нужно, там текст пишется литералами.
Чужой плагин для проверки#
Скачайте релиз или клон репозитория, соберите в контейнере и положите файлы по схеме выше. Так же проверяется pull request: соберите ветку автора у себя и посмотрите живьём, прежде чем принимать.