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工具迷惑的地方,因为它应该只写入my 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上遇到过 exactly this situation,正在对“错误的”使用deps.edn进行更改,无法理解为什么它不起作用。)
by
只是一个小澄清。

在上一段中,当我说“嗯,你自己决定”和“你自己也决定:D”时,“你”指的是将做出关于解决这个问题设计决策的人。

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

我的意图是让这两个选项保持为开放决策点。
没错,我的意思是,“你们”(核心团队)基于当前这些情况下的行为,基本上已经“决定”了。

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

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

我在DigitalOcean上的某些droplets上测试了这个,使用的是最新的Ubuntu。我试了linux和posix安装。

除此之外,我认为如果环境是XDG,所有可能的组合应优先考虑~/.config/clojure而非~/clojure。
感谢你澄清。我重试了并意识到我的其中一台机器设置了XDG_CONFIG_HOME,而另一台没有,我只是没有注意到差异--是的,我确认了你指出的行为,并且我觉得这是错误的。
"如果系统是XDG" - 如何检查这一点?
我不知道这是否能帮到你,亚历克斯,但看起来我在我的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(最常见)— 无变化

第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”。因此,我正在寻找比这更好的答案。
by
强制用户使用 XDG 的担忧非常明确。

每个系统默认设置的 XDG_ 变量似乎都有所不同(Nix on Darwin 会设置 XDG_CONFIG_DIRS 和 XDG_DATA_DIRS)。

如果我们愿意更多地依赖 XDG 命名约定,我们可以更好地解决更明确的用例。

更具体地说

            如果设置了$CLJ_CONFIG,则使用$CLJ_CONFIG(显式覆盖)
            如果设置了任何 $XDG_*,则遵循 XDG 规范(未设置时为 ~/.config/clojure)-- **修改**
            否则使用$HOME/.clojure(最常见)

注意:XDG_* 还可能代表现有的 7 个已记录变量
by
越想、越研究这个规范(xdg base dirs),我越认为这更像是应用是否选择遵循规范的问题,系统在这方面没有责任。

所以,添加一个标志的想法可能是一个可行的方案。这会给用户一个选项,选择是否安装带有全 XDG 支持的 clojure cli,也可以供包管理器(例如 Debian Clojure 包维护者)使用。类似于 `--prefix` 标志。

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

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

注意:代码尚未测试,也不是拉取请求。这只是支持这个评论。
by
在选择安装时做出选择是个好主意。如果您有兴趣为它编写一个补丁,我将非常愿意您这样做。

编辑了
是的,谢谢。我很乐意工作在这个补丁上。

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