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,而不是退回到传统路径。
在任意系统上,在安装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存在?. ~/.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(我需要再次检查这个--最近有人在大群的这种情况中遇到了问题,在对“错误的”use deps.edn进行更改时无法理解为什么它不起作用。)
by
仅仅是一个小的澄清。

在上一段话中,当我说“嗯,你决定”和“你也决定 :D”时,“你”指的是在这种情况下将做出设计决策的人。

我进行澄清,因为可能会将其解释为“用户”,这不是我的意思。

我的意图是让这两个选项成为开放的决定点。
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。
感谢你的澄清。我重新测试后意识到我的其中一台机器上设置了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不存在,那么命令行脚本应假定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(最常见)
by
是的,这有记载。这是好的。但我认为这更像是一种改变当前行为的建议。为什么?因为$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(最常见)——无改变

第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约定(未设置时为$XDG_CONFIG_HOME/clojure或~/.config/clojure)-- **更改**
            否则使用$HOME/.clojure(最常见)

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

所以,添加一个标志的想法可能是一个合理的方案。这给用户提供了一个选项,选择是否支持XDG安装clojure cli,同时也为软件包管理器(比如debian的Clojure包维护者)。类似于`--prefix`标志。

这是在提交中的想法:在代码中更容易解释:[链接](https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2)

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

注意:代码未经测试,也不是一个Pull Request。它只是支持这个评论。
在安装时选择是一个好主意。如果您有兴趣为其制作一个补丁,我会很乐意让您这么做。

编辑
是的,谢谢。我很高兴为此工作。

我将按照以下说明进行: https://clojure.org/dev/dev
...