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

欢迎!请查看关于页面了解如何使用本站更多信息。

+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变量)都没有设置,应该使用定义好的默认值。这里是clj工具容易混淆的部分,因为它应该将数据写入~/.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
您最后的段落基本上是 Clojure CLI 当前所做的。

我将~/.clojure 移动到~/.config/clojure,而 CLI 对此非常满意,愿意使用该目录。只要只有一个或另一个存在,CLI 就会“做正确的事”。

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

如果两者都存在,我认为它将默认为~/.clojure(我需要再次检查这一点——最近有人在 Slack 上遇到了这种情况,并且正在更改“错误的”use deps.edn,但无法理解为什么它没有生效。)
只是一个小的澄清。

在最后一段中,当我说“好吧,由你来决定”和“你也自己决定 :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(最常见)——不更改

第三种情况还可以是

            如果 $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_变量版本(在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
...