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) 及 (路径 HOME/.config/clojure)

在大多数发行版上,XDG_CONFIG_HOME(以及其他 xdg 变量)都是未设置的,而且有一些默认值应该使用。这里是 cloj 工具迷惑的部分,因为它应该直接写入 my HOME/.config/clojure,而不是回退到旧路径。
by
在任意系统上,在安装Clojure之前,$HOME/.clojure 将不存在 —— 因此你实际上是在根据您的评论逻辑请求 Clojure CLI 在所有系统上切换到 XDG。

我是不是误解了您?

1 个答案

0 投票
by

问题持续是:Clojure CLI 如何确切地知道你希望使用 XDG 配置选项。如果对这个问题的答案明确,我愿意使用这个答案来选择这个行为。我们不会将其改为默认行为。

另一个选择是有一个 Clojure CLI 专用的环境变量,你可以设置它来实现这个目的(但你需要采取这个行动)。

by
编辑 by
确定这一点的通常方法,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/.软件名` 被视为遗留的,默认行为是遵循 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
只是一个小澄清。

在最后一段,当我说“你决定”和“你也决定 :D”时,“你”指的是在设计决策中进行决策的相关人员。

我进行澄清,因为这可以理解为“用户”,但这并不是我的意图。

我打算将这两个选项留作开放的决定点。
是的,我在说“你们”(核心团队)已经根据这些情况下的当前行为在本质上“作出了决定”。

你认为当前的某些行为是否“错误”吗?
当不存在文件夹时,如果系统是XDG但环境变量XDG_CONFIG_HOME未设置,Clojure的第一个执行应该创建~/.config/clojure,但它却创建了~/.clojure。

在XDG系统中~/.config/clojure存在但环境变量XDG_CONFIG_HOME未设置的情况下,Clojure应该使用它,但使用代~/.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配合使用,就变成了强制性的。


    用户 - 跨项目配置(通常是工具)
        按照以下顺序使用的位置
            如果$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约定文件夹。
正如我上面说的,“如果 $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 base dirs)的思考和阅读越来越多,我认为这更多的是应用程序选择是否遵循规范的选项,而系统在这方面没有责任。

因此,添加一个标志可能是可行的。这给用户提供了安装 clojure CLI 时是否完全支持 XDG 的选项,以及给包管理器(比如 Debian 的 Clojure 包维护者)。类似于 `--prefix` 标志。

以下是这个想法在一个提交中的实现:代码描述更为清晰:[链接](https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2)

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

注意:代码尚未测试,这不是一个 Pull Request。它只是为了支持这个评论。
在安装时选择是一个好主意。如果你有兴趣为它修复补丁,我会很高兴让你这样做的。

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

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