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而不是回退到旧路径。
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存在?而~/.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。这个特定的案例正是你通过将~/.clojure移动到~/.config/clojure所做的实验,但得到的结果不同(唯一详细的是,我确保未设置环境变量)。

我在digital ocean的某些droplet上与最新的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运行游戏,则成为强制性的。
我仍然在询问这个线程最顶部的问题,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基本目录),我认为这更多的是一个应用程序选择是否遵循规范的问题,系统在这方面没有责任。

因此,增加一个标志的想法可能是最佳方案。这给用户提供了选择是否安装带有XDG完整支持的clojure cli的选项,以及给包管理器(考虑Debian Clojure软件包维护者)。类似于`--prefix`标志。

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

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

注意:代码未经测试,也不是一个Pull Request。它只是为了支持这个评论。
by
在安装时进行选择是个不错的主意。如果你有兴趣为此制作补丁,我会很高兴让你这么做。
by
编辑 by
是的,谢谢。我很乐意制作补丁。

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