[英]Difference between lein repl (-main “something”) and lein run “something”)
新手Clojure和leiningen問題:
鑒於我的項目中的代碼片段,這可以從lein repl開始:
==> (-main "something")
產生預期的“命令:某些東西......正在運行...已完成”,但在命令行中無效:
me pallet1]lein run "something"
生成“命令:某事......錯誤:未解析為命令”
為什么? / 我如何解決它?
重現:
lein new eg
然后編輯生成的項目文件,添加:main eg.core
來定義main函數,並編輯生成的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運行的東西沒有(即打印“錯誤:未解決”消息)
問題是當你從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"))
lein exec插件對於在項目環境中編寫此類內容非常有用。 我已經廣泛使用它在clojure和其他腳本編寫情況下編寫Jenkins工作
lein exec -pe '(something ...) (something-else) (save-results)'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.