2024 年 Clojure 状况调查中分享您的想法!

欢迎!请参阅关于页面获取此机制更多信息。

+4
工具
重新标记

不需要显式设置 XDG_CONFIG_HOME,并遵循 XDG 规范的工具应该直接写入 $HOME/.config/clojure。

目前,如果未设置 XDG_CONFIG_HOME,则会直接写入 $HOME/.clojure。

更多背景信息见此处
https://clojureverse.org/t/opinion-about-xdg-support-by-the-clojure-tools-deps-cli/9814/3

Do XDG systems always have $HOME/.config even if it is empty? If not, then what if the CLI were the first tool to run in a new user account -- it wouldn't find $HOME/.config and XDG_CONFIG_HOME wouldn't be set, so wouldn't it deduce this was not an XDG system and write to $HOME/.clojure instead of $HOME/.config/clojure? (this question would apply to all tools in such an environment, so I'm wondering what creates $HOME/.config in the first place)
根据 arch wiki,'only XDG_RUNTIME_DIR is set by default through pam_systemd(8). It is up to the user to explicitly define the other variables according to the specification.'


https://wiki.archlinux.org/title/XDG_Base_Directory

但在现实中,如果你检查应用是否符合XDG规范,大多数应用只是遵循逻辑行事,而没有检查XDG_RUNTIME_DIR,我认为。

1. 如果HOME/.clojure存在,则使用旧路径
2. 否则使用XDG规范,(或(getenv XDG_CONFIG_HOME)(路径HOME/.config/clojure))

在大多数发行版上,XDG_CONFIG_HOME(以及其他xdg变量)被设置为未设置,应该使用定义好的默认值。这就是clj工具感到困惑的部分,因为它应该只把文件写入my HOME/.config/clojure,而不是退回到旧路径。
在任意系统上,在安装Clojure之前,$HOME/.clojure不会存在——因此,实际上你是在根据你的评论中的逻辑要求Clojure CLI在所有系统上切换到XDG。

我理解错你了吗?

1 答案

0 投票

问题继续是:Clojure CLI如何确切地知道你想使用XDG配置选项。如果这个问题有明确的答案,我会很高兴使用它来选择这种行为。我们不会将其更改为默认行为。

另一个选项是在Clojure CLI中有一个特定环境变量,你可以设置它来完成这个任务(但你需要采取那个行动)。


编辑
确定此问题的一种方法,由Freedesktop工具使用,是首先检查环境变量是否存在(XDG_CONFIG_HOME),如果不存在,则检查$HOME/.config文件夹是否存在。这是`pyxdg`中的实现。我在这里提及它[1]

关于Clojure CLI专用的环境替代选项:尽管我个人更喜欢让XDG优先于`.clojure`,但我确实更喜欢这个选项而不是目前的状况,我只想以Haskell#Stack作为一个例子[1]。

原因是我,作为一个XDG用户,我有比Clojure更多的软件,我不想让Clojure决定我是否需要设置`XDG_CONFIG_HOME`。我认为应该是反向的。我决定是否设置该变量,我决定是否利用XDG,然后我安装Clojure,也许告诉它是否尊重XDG。我仍然更喜欢不让Clojure知道这一点,但我也理解这种折衷方案。

请注意,Archlinux表中大多数其他示例都已进行完全迁移,将`$HOME/.name-of-the-software`视为遗留方式,默认行为是遵循XDG。

从Clojure的角度来看,新想法可能是这样的

/clojure存在?且~/.clojude不存在?使用现有的一个。
/clojure不存在且~/.clojure存在?使用现有的一个。
但如果两者都存在吗?...好吧,你来决定。
如果没有东西存在?...你也决定 :D。


[1] https://clojureverse.org/t/opinion-about-xdg-support-by-the-clojure-tools-deps-cli/9814/3?u=jgomo3
[2] 在@sg-qwt从Archwiki分享的表中,搜索Haskell#Stack: https://wiki.archlinux.org/title/XDG_Base_Directory
by
您的最后一段总结地说,这正是Clojure CLI目前所做的事情。

我将~/.clojure移至~/.config/clojure,CLI非常乐意使用该目录。只要只有一个或另一个存在,CLI就会已经“做正确的事”。

如果都不存在,它将默认为~/.clojure

如果两者都存在,我认为它将默认为~/.clojure(我必须再次检查这一点--最近有人在Slack上遇到了这种情况,并对错误的use deps.edn进行了更改,不明白为什么它不起作用。)
by
只是一个小的澄清。

在上一个段落中,当我说,“好吧,你决定”和“你也决定 :D”时,这里的“你”意味着在处理这个问题时将做出设计决策的人。

我在这里澄清,因为可能会被理解为“用户”,这并不是我的意图。

我的意图是将这两个选项作为开放决策点。
是的,我说的“你们”(核心团队)已经在某种程度上根据当前行为“决定”了这些情况。

目前的行为中,有您认为“错误”的部分吗?
在没有文件夹存在的情况下,如果系统是XDG,但环境变量XDG_CONFIG_HOME未设置,首次clojure执行应创建~/.config/clojure,但它创建了~/.clojure

当在XDG系统中存在~/.config/clojure但环境变量XDG_CONFIG_HOME未设置时,clojure应该使用它,但它使用了~/.clojure。这个特殊情况正是您通过将~/.clojure移动到~/.config/clojure所进行的实验,但我得到了不同的结果(唯一的细节是我确保环境变量未设置)。

我在digital ocean上的某些droplets中测试了最新版的ubuntu。我试过了linux和posix安装。

除此之外,我认为如果环境是XDG,所有可能的组合都应优先考虑~/.config/clojure而不是~/clojure。
感谢您的澄清。我重新测试后意识到,我的一个机器设置了XDG_CONFIG_HOME,而另一个没有,我只是没有注意到差异——而且,是的,我确认了您指出的行为,这在我的看法中确实是不正确的。
"如果系统是XDG" - 您如何检查这个?
我不知道这对你是否有帮助,Alex,但我的Ubuntu系统上默认设置了以下环境变量:

> env|fgrep XDG
XDG_RUNTIME_DIR=/mnt/wslg/runtime-dir
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop

总的来说,如果XDG_CONFIG_HOME没有设置,但 ~/.config/clojure 存在而 ~/.clojure 不存在,那么命令行脚本应该假定使用XDG并使用 ~/.config/clojure

现在的情况令人困惑/容易出错,因为如果有人创建 ~/.config/clojure/deps.edn(或将 ~/.clojure 移动到 ~/.config/clojure),他们预期它会被使用——即使没有 XDG_CONFIG_HOME——但没有该环境变量,命令行会创建 ~/.clojure 并忽略 ~/.config/clojure
在两种情况下,用户都必须明确地进行操作——创建 ~/.config/clojure 或设置 XDG_CONFIG_HOME。在这些之间,设置环境变量似乎对我来说更明显。

我认为现在不再让人困惑了,这是有文档记载的(https://clojure.org/reference/deps_and_cli#deps_sources),对我来说似乎是清楚的

    用户 - 跨项目配置(通常是工具)
        按照此顺序使用的位置
            如果设置了 $CLJ_CONFIG,则使用 $CLJ_CONFIG(显式覆盖)
            如果设置了 $XDG_CONFIG_HOME,则使用 $XDG_CONFIG_HOME/clojure(Freedesktop 协议)
            否则使用 $HOME/.clojure(最常见)
是的,这是有记载的。这是好的。但我认为这更像是一种改变当前行为的提议。为什么?因为 $XDG_CONFIG_HOME 的目的是让用户可以选择覆盖系统行为,而不是Clojure:作为一个XDG用户,我可以通过定义环境变量 XDG_CONFIG_HOME 来改变配置文件夹的位置。这更关乎改变而非真正设置。

但根据Clojure解释器的当前文档行为,将变量解析为该唯一方式设置XDG配置文件夹,这并不正确。这使得本应为XDG用户可选的某个配置成为必须,如果用户希望Clojure运行游戏的话。
我仍在这里询问我在本帖最上面提出的确切问题——Clojure CLI如何知道你要使用XDG配置?如果对这个问题的答案有其他解决方案,那么我很乐意更改该逻辑中的第二个if条件。我不会改变当前的行为。
我对这个问题给出了答案,但也许它在这个来回讨论中丢失了。以下是我认为人们想要的东西——以及我现在确实希望看到的东西

    用户 - 跨项目配置(通常是工具)
        按照此顺序使用的位置
            如果设置了$CLJ_CONFIG,则使用$CLJ_CONFIG(显式覆盖)——无变化
            如果设置了$XDG_CONFIG_HOME,则使用$XDG_CONFIG_HOME/clojure——无变化
            如果$HOME/.config/clojure存在,则使用它(Freedesktop约定)——**新**
            否则使用$HOME/.clojure(最常见)——无变化

第三个条件也可以是

            如果$HOME/.clojure不存在但$HOME/.config/clojure存在,则使用后者(Freedesktop约定)

如果两个目录均不存在,并且没有设置相关环境变量,现在使用$HOME/.clojure。

如果$HOME/.clojure存在,并且没有设置相关环境变量,现在使用$HOME/.clojure。

如果$HOME/.clojure不存在但$HOME/.config/clojure存在(并且没有设置相关环境变量),使用$HOME/.config/clojure(XDG风格——这是所请求的更改)。

希望这使事情变得更清晰?(希望本线程中的XDG倡导者可以证实这是正确的/可接受的)

并澄清当前XDG用户的问题

如果他们将$HOME/.clojure移至$HOME/.config/clojure,但没有设置可选的XDG_CONFIG_HOME环境变量,CLI将重新创建$HOME/.clojure,并忽略XDG约定文件夹。
正如我上面所说的,“如果$HOME/.config/clojure存在”,这似乎并没有告诉你它是一个XDG系统,仍然需要你积极地在你的系统上做一些事情,所以这似乎也不能回答最初的问题。所以,这似乎不是一个好的答案。你说移动你的.clojure目录是XDG用户的问题,但我并不认同,这似乎与最初的问题相矛盾,最初的问题是“XDG_CONFIG_HOME无需显式设置,遵循XDG规范的工具应该直接写入$HOME/.config/clojure”。所以,我在寻找比这更好的答案。
by
强迫用户进入XDG的担忧非常明显。

每个系统似乎都有默认设置的不同的XDG_变量(Nix在Darwin上设置了XDG_CONFIG_DIRS和XDG_DATA_DIRS)。

如果我们愿意更多地依赖XDG的命名和约定,我们就可以提高我们对明确用例的覆盖范围。

更具体地说

            如果设置了 $CLJ_CONFIG,则使用 $CLJ_CONFIG(显式覆盖)
            如果设置了任何$XDG_*,则遵循XDG约定(未设置时为$XDG_CONFIG_HOME/clojure或~/.config/clojure)-- **修改**
            否则使用 $HOME/.clojure(最常见)

注意:XDG_*也可以代表现有的只有7个文档化的变量
by
我越想这个问题(关于xdg基础目录规范),就越觉得这是应用选择是否遵循规范的问题,而系统在这一点上没有责任。

所以,添加一个标志可能是可行的方案。这给用户提供了选择安装带有或不带有XDG完全支持 clojure cli 的选项,也方便了包管理器(例如,考虑wdg的Clojure包维护者)。类似于--prefix标志。

这是在提交中的一个想法:用代码更容易解释:https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2

一个重要的事情是,这个想法不是要改变当前的行为。

注意:代码未经过测试,这也不是一个Pull Request。它只是支持这个评论。
by
在安装时进行选择是一个好主意。如果你对此感兴趣并想为它修补,我会很高兴。

编辑了
是的,谢谢。我很高兴能参与这个补丁的开发。

我将遵循以下说明:https://clojure.org/dev/dev
...