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

是否有XDG系统在为空的情况下总是拥有$HOME/.config?如果不是这样的话,那么假设CLI是第一个在新建用户帐户中运行的工具,它将找不到$HOME/.config,XDG_CONFIG_HOME也不会设置,那么它会不会推断这不是一个XDG系统并且写作$HOME/.clojure而不是$HOME/.config/clojure?(这个问题适用于该环境中所有工具,因此我想知道谁创建了$HOME/.config)
根据Arch wiki,'只有通过pam_systemd(8)默认设置XDG_RUNTIME_DIR。其他变量根据规范由用户显式定义。'


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

但实际上,如果你检查应用对XDG规范的实现,大多数只是按照逻辑执行而不检查XDG_RUNTIME_DIR。

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

XDG_CONFIG_HOME(以及其他xdg变量)在大多数发行版上未设置,应使用预定义的默认值。这里是clj工具困惑的部分,因为它应该直接写入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的角度来看,新的想法可能如下

<xdg-config-path>/clojure 存在且~/.clojude 不存在?使用现有的一个。
<xdg-config-path>/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上遇到了 exactly this situation 并且在更改“错误”的使用deps.edn 时不明白为什么它没有生效。
by
只是一个小的澄清。

在上一段,当我说话“好吧,你决定”和“你也决定 :D”时,这里的“你”指的是在处理这个问题时,将做出设计决定的人。

我在这里进行澄清,因为人们可能会将其理解为“用户”,但这并不是我的本意。

我打算把这两个选项保留作为可以自由决策的点。
没错,我所说的“你”(核心团队)基于目前这些情况下的行为已经基本上“做出了决定”。

你觉得目前的哪一部分行为是“错误”的?
当没有文件夹存在时,如果系统是XDG,但环境变量XDG_CONFIG_HOME未设置,第一个clojure执行时应该创建~/.config/clojure,但它却创建了~/.clojure。

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

我在digitalocean的一些droplets上用最新的ubuntu测试了这个,我试着使用了linux和posix安装。

除此之外,我认为如果在XDG环境中,所有可能组合都应优先考虑~/.config/clojure而不是~/clojure。
谢谢你的澄清。我重新测试后发现,我的机器中有XDG_CONFIG_HOME被设置,而另一台机器没有,我之前没有注意到这一区别——是的,我确认了你提到的行为,这确实在我看来是错误的。
评论者:
"如果系统是 XDG",你该如何检查这一点?
评论者:
我不知道这有没有帮助,但看起来我在 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 不存在,那么 CLI 脚本应该假设 XDG 并使用 ~/.config/clojure

现在发生的事情让人困惑/易出错,因为如果有人创建 ~/.config/clojure/deps.edn(或将 ~/.clojure 移动到 ~/.config/clojure),他们预计会使用它——即使没有 XDG_CONFIG_HOME——但是没有这个环境变量,CLI 会创建 ~/.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(最常见)
by
是的,有文档记录。这是好事。但我觉得这更像是一个改变当前行为的提案。为什么?因为$XDG_CONFIG_HOME是为了让用户能够独立于Clojure覆盖系统行为而设置的选项:作为XDG用户,我可以通过定义环境变量XDG_CONFIG_HOME来改变配置文件夹的位置。这不仅是设置它,更重要的是改变它。

但当前Clojure解释器的文档行为会将这个变量解释为设置XDG配置文件夹的唯一方式,这并不是事实。这导致原本可选项的XDG用户必须这样做,如果用户想要Clojure参与游戏的话。
by
我仍然在请教我在这个线程最上端提到的同一个问题——Clojure CLI如何知道你要使用XDG配置?如果对于这个问题有其他答案,那么我愿意更改该逻辑中的第二层if条件。否则我不会改变当前的行为。
by
我已经给出了对这个问题的答案,但也许它在来回讨论中丢失了。我认为大家所询问的——以及我目前更愿意选择的——是这样的

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

第3个条件也可以是

            如果$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约定文件夹。
by
像我上面说的“如果$HOME/.config/clojure存在”似乎并不告诉你它是一个XDG系统,并且仍然需要你主动在你的系统上做一些事情,所以这似乎不能回答原始问题。所以,这看起来不是一个好的答案。你说移动你的.clojure目录是XDG用户的问题,但我不同意,这似乎与原始问题不符,原始问题是“XDG_CONFIG_HOME不需要明确设置,遵循XDG规范的工具应该直接写入$HOME/.config/clojure”。所以,我在寻找比这个更好的答案。
by
强制用户使用XDG的关注点非常明确。

每个系统似乎都有不同的默认XDG_变量组合(Darwin上的Nix设置了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的选项,同时也给了包管理器(例如debain Clojure包维护者)。类似于`--prefix`标志。

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

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

注意:代码未经测试,并不是一个Pull Request。这只是支持这个评论。
在安装时进行选择是个好主意。如果您有兴趣为其工作补丁,我也很乐意让您这样做。

编辑
是的,谢谢。我很乐意为此工作补丁。

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