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

by
xdg系统是否总是有$HOME/.config,即使它是空的?如果不是,那么如果CLI是第一个在新用户帐户中运行的工具怎么办——它找不到$HOME/.config,XDG_CONFIG_HOME也没有设置,所以它不会推断这不是一个xdg系统并写入$HOME/.clojure而不是$HOME/.config/clojure?(这个问题将适用于这个环境中的所有工具,所以我很好奇最初是谁创建了$HOME/.config)
by
根据arch wiki,'只有XDG_RUNTIME_DIR是通过 pam_systemd(8)默认设置的。根据规范,其他变量由用户明确定义。''


https://wiki.archlinux.org/title/XDG_Base_Directory

但在现实中,如果您检查应用程序如何实现XDG spec,我认为大多数应用程序只是遵循以下逻辑,而无需检查XDG_RUNTIME_DIR。

1. 如果HOME/.clojure存在,则使用旧路径
2. 否则使用 XFG 规范,(或 (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
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" - 你如何检查这一点?
我不知道这是否有帮助,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运行游戏,则必须这样做。
我仍然在询问这个帖子最上面的问题——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变量,而且是不同的口味(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基础目录),越觉得这更多的是应用程序选择是否遵守规范的一种选项,而系统在这方面的责任不大。

所以,添加一个标志的想法可能是一个可行的方法。这给了用户安装Clojure CLI时选择是否完整支持XDG选项,也给了包管理器(比如Debian的Clojure包维护者)。类似于`--prefix`标志。

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

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

注意:代码尚未经过测试,并且不是Pull Request。这只是支持这个评论。
在安装时进行选择是一个好主意。如果你有兴趣为其编写补丁,我将非常高兴。

编辑了
是的,谢谢。我很乐意编写这个补丁。

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