Gio::Resource和glib-compile-resources

应用程序和库经常包含是应用程序的一部分的二进制或文本数据,而不是用户数据。例如Gtk::Builder使用的.glade文件、启动画面、Gio::Menu标记XML、CSS文件、图标等。这些通常这些文件放于$datadir/appname目录下,也可以将其转换为文本字面量手动包含在代码中。

Gio::ResourceAPI和glib-compile-resources程序提供了一个方便且有效的替代方案,这个方案有一些良好的性质。你可以将这些文件作为普通文件进行维护,因此你可以轻松的编辑它们,在构建过程中,这些文件将会被组合成一个二进制捆绑包,并将其链接到可执行文件中。这意味着加载资源文件会很高效(因为他们在启动时已经被加载到了内存中,并与其他实例共享)且很简单(无需对IO错误进行检查和在文件系统中查找文件)。这也使得创建可重定位应用程序变得更为简单。

资源包是由glib-compile-resources程序创建的,该程序使用一个XML文件描述资源包并由该XML文件指示资源包引用了那些文件。被引用的文件和XML文件将被组合为一个二进制的资源包。

Gio::Resource参考

一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/toolbar">
    <file preprocess="xml-stripblanks">toolbar.glade</file>
    <file>rain.png</file>
  </gresource>
</gresources>
这将创建一个包含以下文件的资源包:
  • /toolbar/toolbar.glade
  • /toolbar/rain.png

然后你可以使用glib-compile-resources将XML编译为可以用Gio::Resource::create_from_file()加载的二进制包。但是使用--generate-source生成C源文件直接链接到你的应用程序更为常见。例如:

$ glib-compile-resources --target=resources.c --generate-source toolbar.gresource.xml

一旦创建并注册了Gio::Resource,就可以使用API调用(例如:Gio::Resource::open_stream_from_global_resources()流式获取数据或是Gio::Resource::lookup_data_in_global_resources()直接获取指向数据的指针)在进程的全局访问数据。你还可以使用类似于resource:///toolbar/rain.png的URI通过Gio::File访问资源数据。

通常你不需要Gio::Resource实例,因为可以使用Gdk::Pixbuf::create_from_resource()Gtk::Builder::add_from_resource()Gtk::Image::set_from_resource()直接加载资源数据。