请在 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)(或者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工具,首先检查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`被认为是Legacy,默认行为是遵循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上遇到了这种情况,正在更改“错误的”use deps.edn,却无法理解为什么它不起作用。)
by
只是一个小澄清。

在最后一段中,当我提到“好吧,你决定”和“你当然也是”时,“你”指的是在这个问题上做出设计决策的人。

我在澄清,以免被理解为“用户”,这不是我的意思。

我的意图是让这两个选项保持为开放的决策点。
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" - 你如何检查这一点?
我不知道这对你是否有帮助,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 convention)
            否则使用 $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(最常见)——无变动

第三种情况也可以是

            如果$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”。因此,正在寻找一些比这更好的答案。
强迫用户使用 XDG 的担忧非常明确。

每个系统似乎都默认设置了不同的 XDG_ 变量(Nix 在 Darwin 上设置了 XDG_CONFIG_DIRS 和 XDG_DATA_DIRS)。

如果我们愿意更多地依赖 XDG 的命名和规范,我们可以改进我们对明确用例的覆盖范围。

更具体地说

            如果设置了 $CLJ_CONFIG,则使用 $CLJ_CONFIG(显式重写)
            如果设置了任何 $XDG_*,则遵循 XDG 规范(未设置时为 ~/.config/clojure)-- **变更**
            否则使用 $HOME/.clojure(最常见)

注意:XDG_* 也可以代表现有 7 个已记录的变量
我越是思考和阅读这份规范(xdg 基础目录),就越觉得这更多的是由应用程序选择是否遵循规范,而不是系统的责任。

因此,增加一个标志可能是可行的。这样可以给用户选择是否支持 XDG 的 Clojure CLI 选项,也可以给包管理器(考虑 Debian Clojure 包维护者)。类似于 `--prefix` 标志。

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

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

注意:代码尚未测试,也不是拉取请求。它只是为了支持这个评论。
在安装时进行选择是个好主意。如果您有兴趣为它开发补丁,我会很高兴让您这么做。

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

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