首页 文章

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

提问于
浏览
3

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

工作(即打印“Something!”),但lein运行的东西没有(即打印“错误:未解决”消息)

2 回答

  • 5

    问题是当你从lein运行它时你的默认命名空间是“user”命名空间:

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

    打印 #<Namespace user> . 所以它不包含 something 函数,因为它来自另一个命名空间 . 你有几个选择:

    • 传递完全限定的函数名称: your-namespace/something 而不是 something .

    • 使用 your-namespace 而不是 *ns*(ns-resolve 'your-namespace (symbol commandname))

    • -main 中将名称空间更改为 your-namespace .

    方法3的示例:

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

    如果你想逐个调用几个函数,你应该使用do:

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

    不只是像 ( (println "hello") (println "World")) 这样的牙套

  • 2

    lein exec plugin对于在项目上下文中编写此类内容非常有用 . 我已经广泛使用它在clojure和其他脚本编写情况下编写Jenkins工作

    lein exec -pe '(something ...) (something-else) (save-results)'
    

相关问题