Как я могу установить схему Gsettings без прав root?

14

Типичный рабочий процесс для установки схемы Gsettings:

  1. Создайте схему с расширением .gschema.xmlс содержимым, подобным этому:

    <?xml version="1.0" encoding="UTF-8"?>
    <schemalist>
      <schema id="com.companyname.appname" path="/com/companyname/appname/">
          <key type="b" name="mybool">
              <default>false</default>
              <summary>Example summary</summary>
              <description>Example description</description>
          </key>
      </schema>
    </schemalist>
  2. Скопируйте схему в /usr/share/glib-2.0/schemas/.

  3. Скомпилируйте схему, выполнив эту команду:

    sudo glib-compile-schemas /usr/share/glib-2.0/schemas/

Однако для записи в систему /usr/share/glib-2.0/schemas/требуются права суперпользователя. Есть ли способ установить схему в неглобальный каталог пользователя?

Флимм
источник

Ответы:

16

Вы можете скопировать и скомпилировать свои схемы Gsettings в доступный для записи каталог:

$ cp com.companyname.appname ~/schemas/
$ glib-compile-schemas ~/schemas/

Сложность в настройке приложения для использования именно этого каталога. Есть два способа сделать это:

  • С GSETTINGS_SCHEMA_DIRпеременной окружения:

    $ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
  • Или используя объекты GSettingsSchemaSource и GSettingSchema:

    Если у вас есть доступ к исходному коду вашей программы, вы можете изменить его для загрузки скомпилированных схем из любого каталога. Вот как это делается в Python, хотя вы можете сделать это на любом языке программирования с помощью самоанализа GObject:

    schema_source = Gio.SettingsSchemaSource.new_from_directory(
        os.path.expanduser("~/schemas"),
        Gio.SettingsSchemaSource.get_default(),
        False,
    )
    schema = schema_source.lookup('com.companyname.appname', False)
    settings = Gio.Settings.new_full(schema, None, None)
    settings.set_boolean('mybool', True)

Ссылки:

Флимм
источник
Вы также знаете, как проверить, если данная схема уже установлена ​​(и делать выше, только если это не так)?
Пьетро Баттистон
В соответствии с этими документами вы также можете добавить каталог, содержащий glib-2.0/schemasкаталог, в XDG_DATA_DIRSпеременную окружения.
ntc2