当前位置: 首页 > 知识库问答 >
问题:

lein repl(-main“something”)和lein run“something”之间的区别

马淇
2023-03-14

新手Clojure和leiningen问题:

鉴于下面我的项目中的代码片段,这可以从lein repl中获得:

==> (-main "something")

生成预期的“命令:某物…正在运行…完成”,但无法从命令行执行:

me pallet1]lein run "something"

生成"命令:某物...错误:未作为命令解析"

为什么我怎么修理它?

复制:

lein new eg

然后编辑生成的项目文件,添加:main eg.core定义主功能,并编辑生成的src/eg/core。clj文件,并将其粘贴到:

core.clj

(ns eg.core)
(defn something [] (println "Something!"))

(defn run-command-if-any [^String commandname]
    (printf "Command: %s ..." commandname)
    (if-let [cmd (ns-resolve *ns* (symbol commandname))] 
      (
        (println "running ...") (cmd) (println "done.")
      )
      (println "error: not resolved as a command.")
    ))
(defn -main [ commandname ] (run-command-if-any commandname))

然后

lein repl
eg.core=> (-main "something")

作品(即打印的东西!),但lein运行的东西不(即打印的错误:未解决的消息)

共有2个答案

姬温文
2023-03-14

lein exec插件对于在项目上下文中编写这样的东西非常有用。我已经广泛使用这写Jenkins的工作在Clojure和其他脚本的情况下

lein exec -pe '(something ...) (something-else) (save-results)'
艾心远
2023-03-14

问题是,从lein运行时,默认名称空间是“用户”名称空间:

(defn -main [ commandname ] (println *ns*))

打印#

  1. 传递完全限定的函数名:you-namespace/某物而不是某物
  2. 使用you-namespace而不是*ns*(ns-解析'you-namespace(符号命令名))
  3. -main中将命名空间更改为you-namespace

方法3的示例

(defn -main [ commandname ] 
   (in-ns 'your-namespace)
   (run-command-if-any commandname))

此外,如果要逐个调用多个函数,应使用:

(do (println "Hello")
    (println "World"))

不仅仅是像((println“hello”)(println“World”)

 类似资料: