我做了一个 Racket 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 用户会觉得奇怪和不同意吗?
最佳答案
我已经在 JVM 的库中实现了这样的功能和 Rust .这是我学到的:
提供计算配置、缓存等目录的完整路径(包括应用程序名称!)的 API。不这样做将导致代码在 3 个主要平台中的至少 2 个上肯定是错误的,因为约定有很大差异。
考虑由 MegaCorp 公司(网址 MegaCorp.co.uk)编写的名为 Foo App 的应用程序。
在 Linux 下,命名应用程序的路径段应为 fooapp/ (小写,无空格),在 Windows 上它应该是 MegaCorp\Foo App\ (注意 两个 文件夹),在 macOS 上它应该是 uk.co.MegaCorp.Foo-App (无效字符替换为 - )。
例如,我的图书馆不提供 runtimeDir在 macOS 或 Windows 上,因为 XDG_RUNTIME_DIR与e非常不同。 G。 %TEMP%在 Windows 上。
这是一个潜在的安全问题来源,因为 Linux 上的运行时目录保证它只能由所有者访问,在用户注销时被删除,等等。
此外,我只提供fontDir在 Linux 和 macOS 上。 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 等的“Standard Directory Library”,以避免混淆.
希望这对您有所帮助!
关于linux - 适用于 Windows 的 XDG Basedir 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853548/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc