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的说明,“只有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)与(路径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 上遇到了这种情况,正在更新“错误的”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”——您如何检查这个条件?
by
我不知道这对你有没有帮助,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
by
在这两种情况下,用户必须明确定义要执行的操作——无论是创建~/.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运行游戏时变得强制性的。
我依然在询问这个问题,就像在帖子的最顶端一样——Clojure CLI是如何知道您想使用XDG配置的?如果对这个问题的答案有其他解释,那么我很乐意修改那个逻辑中的第二个if条件。否则我不会改变现在的行为。
我对这个问题已经给出了解答,但或许在来回讨论中丢失了。我认为大家所期望的是——当然我目前也会更倾向于这样的方式

    用户 - 交叉项目配置(通常是工具)
        按此顺序使用的位置
            如果设置了$$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约定文件夹。
正如我上面所说,“如果$HOME/.config/clojure存在”似乎并没有告诉你是XDG系统,仍然需要在您的系统上主动做一些事情,所以似乎没有回答原始问题。因此,这似乎不是一个好的答案。你说移动您的.clojure目录是XDG用户的问题,但我不同意,这似乎与原始问题(“XDG_CONFIG_HOME不需要显式设置,遵循XDG规范的工具应直接写入$HOME/.config/clojure”)不一致。所以,在寻找比这更好的答案。
强制用户使用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个现有的文档变量
越想越觉得这个规范(xdg基本目录)更像是应用的选择,是否选择遵循规范,系统在这方面没有责任。

所以,添加标志的想法可能是一个可行的方案。这给用户选择了是安装支持XDG的clojure cli还是不支持,同时也有包管理器(例如debain Clojure包维护者)。类似于`--prefix`标志。

下面是一个提交的内容:代码中更容易解释:https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2

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

注意:代码没有经过测试,这不是一个Pull Request。只是支持这个评论。
在选择安装时进行选择是个不错的想法。如果您有兴趣为其制作补丁,我会很高兴您能这样做。
是的,谢谢。我很乐意制作这个补丁。

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