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存在?且~/.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

当在XDG系统中 ~/.config/clojure 存在,但环境变量 XDG_CONFIG_HOME 未设置时,clojure应使用它,但它使用 ~/.clojure。这个特殊情况正是你通过将 ~/.clojure 移动到 ~/.config/clojure 所做的实验,但结果不同(唯一的不同之处是确保环境变量未设置)。

我在数字海洋上的某些droplets中测试了这个问题,使用的最新版ubuntu。我尝试了linux和posix安装。

除此之外,我认为如果环境是XDG,所有可能的组合都应该优先使用 ~/.config/clojure 而非 ~/clojure。
感谢您的解释。我重新测试后意识到我的机器中有一个设置了 XDG_CONFIG_HOME,而另一个没有,我之前没有注意到这个差别——是的,我确认了你指出的行为,这看起来确实不正确。
“如果系统是XDG” —— 你如何检查这一点?
by
我不知道这对你是否有帮助,亚历克斯,但我的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 运行游戏,则会这样。
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_ 变量默认设置(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 的选择,以及包管理器(例如,思考 Debian Clojure 软件包维护者)也是如此。类似于 `--prefix` 标志。

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

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

注意:代码没有经过测试,不是拉取请求(Pull Request)。这只是支持这个评论。
by
在选择安装时进行选择是个好主意。如果您有兴趣为之工作,我会很高兴欢迎您这样做。

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

我将遵循这些指示:https://clojure.org/dev/dev
...