В официальном блоге GNOME появилась запись о том, что в грядущем обновлении оболочка потеряет совместимость со старыми дополнениями.
Это связано с переходом с собственной системы импорта для JavaScript runtime GJS (GNOME JavaScript от Mozilla) на стандартную систему импорта JavaScript-модулей (ESM). Это приведет к тому, что дополнения, разработанные для версий старше GNOME 45 перестанут работать в новой версии, а все дополнения, созданные для GNOME 45 и далее — не будут работать на более ранних версиях GNOME.
Теперь разработчикам для сохранения совместимости с разными выпусками GNOME нужно через каталог extensions.gnome.org загружать два варианта дополнения: один для старой версии, другой — для новой. Документацию по теме можно почитать тут.
Если кратко: отличия сводятся к тому, что для подключения, например, JavaScript-модулей и GObject-обвязок раньше использовался объект
imports
, а теперь надо использовать import
:// Before GNOME 45
const GLib = imports.gi.GLib;
// GNOME 45
import GLib from 'gi://GLib';
Для дальнейшей работы в GNOME 45 необходимо:
- изменить код, связанный с загрузкой библиотек;
- обеспечить присутствие в файле extension.js методов
enable()
/disable()
в классе default; - при использовании prefs.js определить подкласс ExtensionPreferences с методом fillPreferencesWindow;
- изменённую версию дополнения привязать к новыми выпускам GNOME Shell через параметр
'"shell-version": [ "45" ]'
вmetadata.json
;
Для старых версий GNOME можно сформировать отдельные варианты дополнений с помощью привязки к старым версиям через параметр shell-version в
metadata.json
.По сути, обратная совместимость со старыми дополнениями будет потеряна из-за отказа GNOME от устаревшей системы импорта, архитектура которой тянется из довольно далекого прошлого и основана на особенностях раннего JavaScript, конкретно — на невозможности разбивать код на несколько файлов.
На заре JavaScript такой подход имел смысл: тогда нужды заливать большие файлы или сразу несколько файлов, относящихся к одному коду, не было. Когда JavaScript перерос «браузерный» ЯП и на нем стали писаться более массивные программы, проблему дробления файла кода на несколько частей решили в node.js и GJS, которые добавили свои собственные системы импорта для организации кода в несколько файлов. Единый стандарт модулей был разработан и предложен ECMAScript 6 еще в 2015 году, но на практике он не совместим с загрузкой через скрипты, так как модуль скрывает все, что не экспортируется явно, что приводит к потере данных при экспорте старым способом.
Разработчики GNOME просят сообщество сообщать обо всех ошибках и проблемах, связанных с новой системой.