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

欢迎!有关本页工作方式的信息,请参阅关于页面。

+4票< meta itemprop="upvoteCount" content="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 存在?而 ~/.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”时,这里的“你”指的是在设计这个问题的解决方案时将对设计做出决定的人。

我在澄清,因为这可能被解释为“用户”,这并不是我的意图。

我打算将这两个选项作为开放的决策点。
by
对,我在说,“你”(核心团队)已经基于这些情况下的当前行为基本上“决定了”。

当前行为中有部分你觉得是“不对”的吗?
by
当没有文件夹存在时,如果系统是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。
by
感谢你的澄清。我重新测试并意识到我的其中一台机器设置了XDG_CONFIG_HOME,而另一台没有,我只是没有注意到差异--是的,我证实了你指出的行为,这在我看确实是错误的。
by
“如果系统是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(最常见)
是的,它已记录在案。这是好事。但我认为这是一个改变当前行为的一种提议。为什么?因为$XDG_CONFIG_HOME旨在为用户提供一个选项来覆盖系统行为,独立于Clojure:我作为一个XDG用户,可以通过定义环境变量XDG_CONFIG_HOME来更改配置文件夹的位置。这更多的是关于改变它,而不是实际设置它。

但是,Clojure解释器当前记录的行为是将此类变量视为设置XDG配置文件夹的唯一方式,这实际上并非如此。这导致原本对XDG用户应为可选的选择,如果用户想要Clojure运行游戏,则变为强制性的。
我仍然在询问 Thread 顶部的确切相同问题 - 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 风格,这是请求的改变)。

希望这能让事情更清楚?(并希望 Thread 中的 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的选项,也提供给包管理器(考虑debian Clojure包维护者)。类似于`--prefix`标志。

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

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

注意:代码尚未测试,这不是一个Pull Request。这只是支持这个评论。
by
在安装时进行选择是个好主意。如果您有兴趣为它工作补丁,我将非常乐意让你们这样做。

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

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