Wie kann ich ein Gsettings-Schema ohne Root-Berechtigungen installieren?

14

Der typische Workflow zum Installieren eines Gsettings-Schemas lautet wie folgt:

  1. Erstellen Sie ein Schema mit der Erweiterung .gschema.xmlmit folgendem Inhalt:

    <?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. Kopieren Sie das Schema nach /usr/share/glib-2.0/schemas/.

  3. Kompilieren Sie das Schema, indem Sie diesen Befehl ausführen:

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

Für das Schreiben in sind /usr/share/glib-2.0/schemas/jedoch Root-Berechtigungen erforderlich. Gibt es eine Möglichkeit, ein Schema in einem nicht globalen Benutzerverzeichnis zu installieren?

Flimm
quelle

Antworten:

16

Sie können Ihre Gsettings-Schemas kopieren und in ein vom Benutzer beschreibbares Verzeichnis kompilieren:

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

Das schwierige Bit ist, die Anwendung für die Verwendung dieses bestimmten Verzeichnisses zu konfigurieren. Hierfür gibt es zwei Möglichkeiten:

  • Mit der GSETTINGS_SCHEMA_DIRUmgebungsvariable:

    $ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
  • Oder verwenden Sie die Objekte GSettingsSchemaSource und GSettingSchema:

    Wenn Sie Zugriff auf den Quellcode Ihres Programms haben, können Sie ihn so ändern, dass kompilierte Schemas aus einem beliebigen Verzeichnis geladen werden. So würde es in Python gemacht, obwohl Sie dies in jeder Programmiersprache mit GObject Introspection tun können:

    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)

Verweise:

Flimm
quelle
Wissen Sie auch, wie Sie überprüfen können, ob ein bestimmtes Schema bereits installiert ist (und obige Schritte nur ausführen, wenn dies nicht der Fall ist)?
Pietro Battiston
Gemäß diesen Dokumenten können Sie glib-2.0/schemasder XDG_DATA_DIRSUmgebungsvariablen auch das Verzeichnis hinzufügen, in dem sich das Verzeichnis befindet .
ntc2