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

欢迎!请参阅关于页面了解有关如何操作的更多信息。

+4
工 cụ
重新标记

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)或(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是否存在?如果不存在~/.clojure,使用现有的一个。
<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。

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

我在 digitalocean 的一些 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 配置?如果对这个问题的答案有别的方法,我愿意更改其中的第二个条件。其他情况下我不会更改当前的行为。
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_ 变量的版本(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 的 claure 命令行工具的选项,同时也给包管理器(例如debian Clojure 包维护者)提供了该选项。类似于 `--prefix` 标志。

以下是一个在提交中的想法:用代码更易于解释:[链接]

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

注意:代码未经测试,这不是一个 Pull Request。它只是为了支持此评论。
by
在安装时选择是个好主意。如果您有兴趣为它修复补丁,我将很高兴看到您这样做。
by
编辑了 by
是的,谢谢。我很乐意修复这个补丁。

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