请在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

Do XDG systems always have $HOME/.config even if it is empty? If not, then what if the CLI were the first tool to run in a new user account -- it wouldn't find $HOME/.config and XDG_CONFIG_HOME wouldn't be set, so wouldn't it deduce this was not an XDG system and write to $HOME/.clojure instead of $HOME/.config/clojure? (this question would apply to all tools in such an environment, so I'm wondering what creates $HOME/.config in the first place)
根据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(我必须再次检查这一点--最近有人在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上的某些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是为了让用户可以选择覆盖系统行为的选项:我作为一个XDG用户,可以通过定义环境变量XDG_CONFIG_HOME来更改配置文件夹的位置。这是关于更改它,而不仅仅是设置它。

但Clojure当前的文档记录行为将这个变量解释为设置XDG配置文件夹的唯一方式,这不是事实。这使本应为XDG用户可选的某些内容变得强制 execute。
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’。因此,我正在寻找一些比这个更好的答案。
强制用户进入 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 命令行的选项,同时也给包管理器(例如,考虑 Debian Clojure 软件包维护者)提供了选择。类似于 `--prefix` 标志。

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

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

注意:代码未经过测试,这不是一个 Pull Request。它只是为了支持这个评论。
在安装时进行选择是一个好主意。如果您有兴趣为此做一个补丁,将很高兴您去完成。

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

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