如何在没有root特权的情况下安装Gsettings架构?


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/需要root特权。有没有办法将架构安装到非全局用户目录?

Answers:


16

您可以将Gsettings模式复制并编译到用户可写目录中:

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

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

  • 使用GSETTINGS_SCHEMA_DIR环境变量:

    $ GSETTINGS_SCHEMA_DIR=~/schemas/ ./example.py
  • 或使用GSettingsSchemaSource和GSettingSchema对象:

    如果您有权访问程序的源代码,则可以对其进行修改以从任何目录加载已编译的架构。尽管您可以使用GObject自省的任何编程语言来执行此操作,但是这是在Python中执行的操作:

    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

根据这些文档,您还可以将包含glib-2.0/schemas目录的目录添加到XDG_DATA_DIRS环境变量。
ntc2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.