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))

在大多数发行版(distros)中,XDG_CONFIG_HOME以及其他xdg变量默认未设置,应该使用已定义的默认值。这里是clj工具容易混淆的部分,因为它应该直接写入~/“.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(我必须再次检查这一点 -- 最近Slack上有一个人遇到了这种情况,他们在更改“错误的”use deps.edn,不明白为什么它不起作用。
by
仅作一个小补充。

在最后一段,当我提到“好吧,你决定”和“你也决定 :D”时,“你”是指在设计此问题解决方案时要做出决策的你。

我澄清这一点是因为它可以被解释为“用户”,但这不是我的意思。

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

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

当~/.config/clojure在XDG系统中存在但环境变量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不存在,那么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
我为此问题给出了答案,但也许它在来回中丢失了。我认为人们是在询问以下内容——以及我个人现在 certainly 东西 prefer 的内容

    用户 - 跨项目配置(通常是工具)
        按顺序使用的位置
            如果设置了 $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 惯例文件夹。
by
正如我上面所说,“如果存在$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`标志。

以下是一个提交中的这个想法:用代码来解释会更简单:[链接](https://github.com/jgomo3/brew-install/commit/bfae7f15291826c0a27e2a76d42a5275493c7da2)

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

注意:代码未经过测试,并且这不是一个Pull Request。这只是支持这个评论。
by
在选择安装时间时是一个好主意。如果你愿意为此工作修复程序,我将非常高兴。

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

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