0%

xdg - 获取 XDG 标准目录路径

XDG 是什么

XDG基本目录规范定义了四类文件的存储路径,分别是:缓存、配置、数据和运行时文件。

这不是一个强制性的规范,但是建议这样保存我们应用产生的文件。

具体规范内容可查看: XDG 基本目录规范

用途

在我们开发一些 cli 应用或者客户端应用的时候,我们如果需要保存一些文件到用户电脑上的话,可以使用这些目录来保存。

对应各个系统下的目录路径

Linux(and BSD) Mac Windows
XDG_DATA_DIRS [/usr/local/share, /usr/share] [/Library/Application Support] %PROGRAMDATA%
XDG_DATA_HOME ~/.local/share ~/Library/Application Support %APPDATA%
XDG_CONFIG_DIRS [/etc/xdg] [/Library/Application Support] %PROGRAMDATA%
XDG_CONFIG_HOME ~/.config ~/Library/Application Support %APPDATA%
XDG_CACHE_HOME ~/.cache ~/Library/Caches %LOCALAPPDATA%
  • XDG_DATA_DIRS:数据目录
  • XDG_DATA_HOME:当前用户数据目录(上面那个是所有用户共用的)
  • XDG_CONFIG_DIRS:配置文件目录
  • XDG_CONFIG_HOME:当前用户配置目录(上面那个是所有用户共用的)
  • XDG_CACHE_HOME:缓存文件目录

使用

  1. 安装 xdg 库
1
go get -u github.com/OpenPeeDeeP/xdg
  1. 实例化
1
2
3
import "github.com/OpenPeeDeeP/xdg"

x := xdg.New("go-lib", "xdf")
  1. 使用

使用起来很简单,因为它的功能就是简单地提供几个目录而已:

1
2
3
4
5
6
// /Users/ruby 是我本地的用户主目录
fmt.Println(x.DataHome()) // /Users/ruby/Library/Application Support/go-lib/xdf
fmt.Println(x.CacheHome()) // /Users/ruby/Library/Caches/go-lib/xdf
fmt.Println(x.ConfigDirs()) // [/Library/Application Support/go-lib/xdf]
fmt.Println(x.ConfigHome()) // /Users/ruby/Library/Application Support/go-lib/xdf
fmt.Println(x.DataDirs()) // [/Library/Application Support/go-lib/xdf]

golang 的根据文件名后缀编译的机制

在这个 OpenPeeDeeP/xdg 库中,我们可以看到有不同文件都实现了 osDefaulter 类型的接口,但是使用的时候并没有报错,这是因为 golang 中我们可以给文件加上不同操作系统的后缀,这样只有当前系统有匹配的文件的时候才会编译,而其他操作系统后缀的文件就不会编译。

比如,xdg_linux.go 在我的 mac 下不会编译,而 xdg_darwin.go 这个文件会被编译,也就是说,在 mac 下,使用的具体实现是 xdg_darwin.go 里面的实现,即使在其他文件里面给同一个结构体定义了相同的方法也不影响。