请在 2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查阅 关于 页面以了解该系统的工作方式。

0 投票
REPL

鉴于新的 tools.deps CLI 功能,将 {{clojure.main -m}} 选项可选用来调用特定函数,而不仅仅是 {{-main}},这将非常方便。

;; 调用 main:clojure -m some.util args ... ;; 调用其他函数:clojure -m some.util/task args ... clojure -m some.util/another-task args ...

`
(ns some.util)

(defn -main [& args] ...)
(defn task [& args] ...)
(defn another-task [& args] ...)
`

创建与 {{clojure}} 工具一起使用的实用程序通常需要为每个 "任务" 创建一个新的命名空间(或者求助于 {{-e}} 或 {{script.clj}} 文件)。

Leiningen 支持 {{lein run -m some.util/task ...}} 语法。Shadow-CLJS 也是如此。

5 个答案

0 投票

评论者:alexmiller

我认为最好是添加一个新标志来支持此功能(例如 -f),而不是将新功能推送到 -m 上。

0 投票

评论者:mfikes

可以考虑的一个替代方案:模仿 ClojureScript 中的现有设施,它具有 * }

`

cljs.user=> (doc main-cli-fn)

cljs.core/main-cli-fn
当编译为命令行目标时,设置到 main-cli-fn 的任何函数都会使用命令行
main-cli-fn 被调用的参数作为参数
作为示例 main-cli-fn
`

为 {{foo.cljs}}

`
(defn greet [name])
(println (str "Hello " name "!"))

(set! main-cli-fn greet)
`

然后

$ planck foo.cljs Friend Hello Friend!

这种情况下,与 {{-m}} 或 {{-f}} 方法相比,确实有一定的优势。如果你创建了一个以 #! 开头的脚本并且希望传递命令行参数,简单地以以下方式启动脚本将非常方便:

`

#!/usr/bin/env clojure

`

然后让 } 机制保证 } 能够路由到该函数,而无需在将 {{-f some-qualified/function}} 放入 shebang 行,因为在 Linux 上无法在 shebang 行中指定解释器参数。

0 投票

评论者:alexmiller

这听起来很不错。:) 我在 clj 中添加了一些新的别名功能,这将有助于解决这些问题。

0 投票

评论者:thheller

补丁实现了所建议的 {{-f}} 参数,而不是更改现有的 {{-m}}。

0 投票
参考: https://clojure.atlassian.net/browse/CLJ-2316 (由 thheller 报告)
...