簡體   English   中英

lein repl(-main“something”)和lein run“something”之間的區別

[英]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函數,因為它來自另一個命名空間。 你有幾個選擇:

  1. 傳遞完全限定的函數名稱: your-namespace/something而不是something
  2. 使用your-namespace而不是*ns* :( (ns-resolve 'your-namespace (symbol commandname))
  3. -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM