为方便访问library,我制作了一个球拍XDG Basedir directories。由于我希望该库也可以在Windows上使用(对于跨平台程序),因此我可以在未设置XDG环境变量时使用标准Windows目录作为默认值。
我目前正在使用以下内容:
$XDG_DATA_HOME
= %LOCALAPPDATA%
$XDG_DATA_DIRS
= %APPDATA%
$XDG_CONFIG_HOME
= %LOCALAPPDATA%
$XDG_CONFIG_DIRS
= %APPDATA%
$XDG_CACHE_HOME
= %TEMP%
$XDG_RUNTIME_DIR
= %TEMP%
我的问题是,是否有更好的默认值。我知道%TEMP%
$XDG_RUNTIME_DIR
是错误的,因为它确实应该在像/tmp
这样的ramfs上,但我不知道Windows上的任何目录都是这样的。在Windows中,似乎没有好的选择将数据和配置目录分开,所以我使用相同的目录。我的直觉是%LOCALAPPDATA%
是可写$XDG_*_HOME
变量的更好选择,并且$XDG_*_DIRS
列表中的“漫游”配置需要读取并且通常不会被覆盖。但是,具有漫游配置的企业Windows用户会发现这种奇怪且不同意吗?
答案 0 :(得分:11)
提供计算完整路径(包括应用程序名称!)的API到配置,缓存等目录。不执行此操作将导致代码在3个主要平台中的至少2个中保证是错误的,因为惯例差别很大。
考虑由名为 Foo App 的公司 MegaCorp (网址 MegaCorp.co.uk )编写的应用程序。
在Linux下,命名应用程序的路径段应为fooapp/
(低位,无空格),在Windows上应为MegaCrop\Foo App\
(请注意两个文件夹),并且在macOS上它应该是uk.co.MegaCorp.Foo-App
(无效字符替换为-
)。
例如,我的库在macOS或Wndows上没有提供runtimeDir
,因为XDG_RUNTIME_DIR
与e非常不同。 G。 Windows上的%TEMP%
。
这是安全问题的潜在来源,因为Linux上的运行时目录保证它只能由所有者访问,在用户注销时删除等等。
另外,我只在Linux和macOS上提供fontDir
。 Windows确实有一个字体目录,但与Linux和macOS不同,它不是用户可写的。
另一方面,我在所有三个平台上同时提供dataDir
(%APPDATA%
)和dataLocalDir
(%LOCALAPPDATA%
)。在macOS和Linux上,这些目录返回相同的路径 - 这是一个明确的设计决策,考虑如果其中一个目录不可用,用户将如何编写代码:用户要么忘记处理它,要么只是回退到另一个目录。使用所选择的设计,这只是开箱即用,用户无需考虑它。
这就是general cache, config etc. directory paths返回%LOCALAPPDATA%
和%APPDATA%
,但application-specific cache and config directory paths返回%LOCALAPPDATA%\Company\Application\cache
和%APPDATA%\Company\Application\config
的原因。
注意子目录!这是为了保证应用程序的缓存,配置和数据目录的清晰分离,无论用户可能具有什么奇怪的Windows设置。
我的库中有三个不同的模块,具有明确定义的独立用例:
BaseDirs,它查询用户不可见的标准目录(缓存,配置,数据,可执行文件,运行时目录)的路径,强烈建议使用 ProjectDirs 。
ProjectDirs,它为您自己的应用程序或项目计算缓存,配置或数据目录的位置,这些目录是从标准目录派生的。
UserDirs,用于查询面向用户的标准目录(音频,文档,下载等)的路径。
虽然BaseDirs
和UserDirs
具有相当无趣的构造函数(new()
),但ProjectDirs
提供了此工厂方法:
ProjectDirs::from(qualifier: &str, organization: &str, application: &str)
此方法可确保用户最终获得正确的,符合标准的路径到应用程序的缓存,配置等目录 - 而无需了解每个平台的所有复杂性。
最后一个建议:我将保留一个名为“XDG Basedir Library”的库,专注于Linux,并发布一个更通用名称的库,如“标准目录库”,处理Linux,Windows等,以避免混淆
希望这有用!