如何在没有root权限的情况下安装Gsettings Schema?

安装Gsettings Schema的典型工作流程如下:
  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>示例摘要</summary>
              <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/需要root权限。有没有一种方法可以将模式安装到非全局用户目录?
1个回答

你可以将Gsettings Schemas复制并编译到可由用户写入的目录中。
$ cp com.companyname.appname ~/schemas/
$ glib-compile-schemas ~/schemas/

棘手的部分是配置应用程序以使用该特定目录。有两种方法可以做到这一点:

使用GSETTINGS_SCHEMA_DIR环境变量:
$ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
或者使用GSettingsSchemaSourceGSettingSchema对象: 如果你可以访问你的程序的源代码,你可以修改它以从任何目录加载编译好的模式。下面是在Python中如何实现的,尽管你也可以用GObject introspection的任何编程语言来做到这一点:
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)

参考资料:


你还知道如何检查给定的模式是否已安装(并且只在未安装时执行上述操作)吗? - Pietro Battiston
3根据这些文档,你还可以将包含glib-2.0/schemas目录的目录添加到XDG_DATA_DIRS环境变量中。 - ntc2