首页 > 解决方案 > 何时在 Clojure CLI 中使用 -M、-A 或 -X?

问题描述

我一直在使用 -A 和 clojure 工具,但是一些警告说我应该使用 -M 代替,我找到了这个 doc,但还没有得出什么时候使用每个的结论。

标签: clojure

解决方案


Clojure CLI 仍在不断发展,因此该-X选项相对较新,并且该-M选项的含义在同一时间范围内发生了变化。

您可以在此处查看 CLI 版本和简短的发行说明:https ://clojure.org/releases/tools

直到 2020 年年中,你什么都用上-A了。-M只需运行:main-opts-- 它不尊重任何类路径选项或解析选项。

在版本 1.10.1.697(2020 年 9 月 25 日)中,-X引入了该选项以允许执行特定的 Clojure 函数,将数据的哈希映射作为单个参数传递。该版本还扩展了-M尊重:extra-paths:extra-deps运行选项的行为:main-opts- 有效地-M等同于-A.

这些选项的工作方式和 CLI 的整体行为方式发生了相当多的变化,直到大约一个月后的 1.10.1.727(2020 年 10 月 21 日)稳定下来。在此期间,该-A选项的运行行为已:main-opts被有效弃用:如果您现在使用-Ato run :main-opts,则会收到一条警告,建议您-M改用该选项。

几个基于 Clojure CLI 的社区工具,并deps.edn在其 README 中注明您需要至少使用 1.10.1.727 版本才能利用它们的功能。版本 1.10.3.814 是当前版本(截至 2021 年 3 月 16 日)。由于 CLI 添加了新功能,因此值得保持更新(并且可能很快会进行另一轮更改)。

所有这一切的 TL;DR 是:

  • 用于-Mrunclojure.main和 any——:main-opts这包括-m标识一个命名空间,其-main函数应该被执行,也-e包括评估一个表达式。请注意,这-main是一个使用零个或多个参数调用的可变参数函数String
  • 用于-X运行特定函数,将单个哈希映射作为其参数,除了 in 之外,还通过命令行传入键/值:exec-argsdeps.edn。请注意,-X接受 EDN 值,这意味着需要在命令行上仔细引用字符串:'"A string"'-- 双引号用于 EDN 字符串,单引号用于确保值通过 shell 按原样传递。在 Windows、viacmd.exe或 Powershell 上,引用比这更复杂(在 Linux 和 macOS 上使用 Clojure CLI 要容易得多,因此对于 Windows,值得考虑 WSL2)。
  • 用于-A启动 REPL。目前,这意味着您需要小心:main-opts与启动 REPL 时使用的别名混合(因为-A仍然运行:main-opts但在某些时候它会停止这样做)。

现在另一个有用的选项是-P--prepare -- 您可以在clojure(之前-X-M-A)之后立即添加它,它允许 CLI 计算和解析来自deps.edn文件和提供的别名的所有依赖项(并下载 Maven/Clojars JAR 和clone git deps),但在实际执行函数之前停止(特定函数 for -Xclojure.mainfor-M或 REPL for -A)。

关于版本的最后一点说明:虽然 CLI 版本号以 Clojure 版本号为前缀,但它们并没有直接关联。您可以使用任何版本的 CLI 运行任何版本的 Clojure(回到 1.0.0)。CLI 的版本号是Clojure的默认版本,如果您不通过别名或项目文件覆盖它,您将x.y.z.commits在哪里获得它。x.y.zdeps.edn


推荐阅读