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) 或 (path HOME/.config/clojure))

在大多数发行版中,XDG_CONFIG_HOME(以及其他xdg变量)都没有被设置,应该使用定义好的默认值。这是clj工具感到困惑的部分,因为它应该写入HOME/.config/clojure而不是回退到旧路径。
by
在任意系统中,在安装Clojure之前,$HOME/.clojure不会存在——所以根据你评论中的逻辑,你实际上是请求Clojure CLI在所有系统上切换到XDG。

我是不是理解错了你的意思?

1 个答案

0
by

这个问题还在继续:如何让Clojure CLI确定你希望使用XDG配置选项。如果对这个问题的回答是确定的,我将很乐意使用这个答案来确定这种行为。我们不会将其更改为默认行为。

另一个选项是有一个Clojure CLI特定的环境变量,你可以设置它来实现这一点(但你必须采取这个行动)。

by
编辑 by
确定这一点的—a 种方法是使用 Freedesktop 工具,首先检查 env 变量是否存在 (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 上遇到 exactly 这 种情况,正在修改错误的 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”——你怎么检查这一点?
我不知道这对你是否有帮助,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配置?如果有其他答案,我不介意更改该逻辑中的第二个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(最常见)

N.B.: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
...