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)
根据archwiki,'only XDG_RUNTIME_DIR is set by default through pam_systemd(8). It is up to the user to explicitly define the other variables according to the specification.'


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

但在现实中,如果你检查应用程序如何遵循XDG规范,我认为大多数应用程序只是遵循以下逻辑而不会检查XDG_RUNTIME_DIR。

<1> 如果存在 HOME/.clojure,则使用Legacy路径
<2> 否则使用XFG规范,(或者 (getenv XDG_CONFIG_HOME) &nbsp; (path HOME/.config/clojure))

XDG_CONFIG_HOME(以及其他的xdg变量)在大多数发行版中未设置,应使用定义好的默认值。这里的问题是clj工具会困惑,因为它本应该直接写入HOME/.config/clojure,而不是退回到Legacy路径。
在任意系统上,安装Clojure之前,$HOME/.clojure将不存在,因此根据您在评论中的逻辑,这相当于您要求Clojure CLI在所有系统上切换到XDG。

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

1 答案

0

问题是:Clojure CLI如何明确知道您希望使用XDG配置选项。如果您有对这个问题的明确答案,我将很高兴使用那个来选择这种行为。我们不会将其更改为默认行为。

另一种选择是设置一个Clojure CLI特有的环境变量来实现这一点(但是您需要采取这个行动)。


编辑了
确定这种情况的一种方法,是FreeDesktop工具使用的,首先检查是否存在环境变量(XDG_CONFIG_HOME),如果不存在,则检查是否存在$HOME/.config文件夹。这是`pyxdg`中的实现。我在这里提及它[1]

关于Clojure CLI特定环境的替代选项:虽然我个人更希望XDG优于.dotclojure,但我更倾向于这个具体的选项,而不是当前的情况,我只是举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
您的最后一段话基本上就是Clojure CLI目前所做的事情。

我将~/.clojure移动到~/.config/clojure,并且CLI对此目录的使用非常满意。只要只有其中一个或另一个存在,CLI就已经“做了正确的事情”。

如果都不存在,则默认为~/.clojure

如果两个都存在,我认为它将默认为~/.clojure(我可能需要再次确认--最近有人在Slack上遇到这种情况,并更改了“错误”的use deps.edn,并且不能理解为什么它没有生效。)
这是一点小澄清。

在最后一段中,当我说“好吧,你决定”和“你也决定 :D”时,“你”指的是在解决这个问题时将作出设计决策的人。

我澄清这一点,因为可能会被解释为“用户”,这并不是我的意思。

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

当前行为中有没有你认为“错误”的部分?
当不存在文件夹时,如果系统是XDG但未设置环境变量XDG_CONFIG_HOME,第一次clojure执行应该创建~/.config/clojure,但它创建了~/.clojure。

当在XDG系统中存在~/.config/clojure但未设置环境变量XDG_CONFIG_HOME时,clojure应该使用它,但使用的是~/.clojure。这个特定情况正是你通过将~/.clojure移动到~/.config/clojure所进行的实验,但我得到了不同的结果(唯一的细节是我确保没有设置环境变量)。

我在数字海洋的某些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_变量版本(Darwin上的Nix设置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基本目录),我越觉得这更多的是应用程序选择的选项,即是否遵循规范,而系统在这方面没有责任。

所以,添加一个标志的想法可能是可行的。这会给用户选择安装支持或不支持XDG的clojure cli的选项,也会给包管理器(考虑一下Debian Clojure包维护者)。类似于`--prefix`标志。

这是在commit中的一个想法:用代码解释会更简单:https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2

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

注意:代码未经测试,也不是Pull Request。这只是支持这个评论。
在安装时进行选择是一个好主意。如果您有兴趣为它修复补丁,我将非常乐意您这样做。

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

我将遵循以下指示:https://clojure.org/dev/dev
...