2024Clojure状态调查!中分享你的想法。

欢迎!请查看关于页面获取更多关于此工作方式的详细信息。

+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,'只有XDG_RUNTIME_DIR通过pam_systemd(8)默认设置。其他变量必须根据规范明确定义,这取决于用户.'


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变量)没有被设置,应该使用默认值。这部分是clojure工具容易出问题的原因,因为它应该直接写入HOME/.config/clojure,而不是回退到旧路径。
by
在一个任意系统中,在安装Clojure之前,$HOME/.clojure不会存在 - 因此你实际上是在请求Clojure CLI基于你的评论中的逻辑在所有系统上切换到XDG。

我是不是理解错了你的意思?

1 答案

0
by

问题仍然是:Clojure CLI如何明确知道你想使用XDG配置选项。如果对这个问题的回答是确定的,我将很高兴使用这个回答来选择这种行为。我们不会将其更改为默认设置。

另一个选项是有一个Clojure CLI特有的环境变量,你可以设置以执行该操作(但你需要采取该操作)。

by
编辑 by
确定这种方法的其中一种方式是为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上遇到了这种情况,他们在对“错误的”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不存在,那么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(最常见)
是的,这是有文档记录的。这是好事。但我想这更像是一个改变当前行为的提议。为什么?因为$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(最常见)——无变化

第三个条件也可以是

            如果$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”。因此,我们需要寻找比这更好的答案。
强制用户使用 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 个已记录变量的代称
我越思考、阅读关于这个规范(xdg 基础目录),就越觉得这更多的是应用的选择,是否遵循规范,而系统在这方面没有责任。

因此,增加一个标志的想法可能是正确的途径。这给用户选择是安装完全支持 XDG 的 clojure cli 还是安装不完全支持的选项,同时给包管理器(例如 Debian Clojure 包维护者)。类似于 `--prefix` 标志。

请参见这个提交:在代码中更容易解释:https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2

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

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

编辑
是的,谢谢。我很乐意工作在这个补丁上。

我将遵循以下指南: https://clojure.org/dev/dev
...