4

新手 Clojure 和 leiningen 问题:

鉴于下面我项目中的代码片段,这适用于 lein repl :

==> (-main "something")

产生预期的“命令:某事......运行......完成”,但不能从命令行工作:

me pallet1]lein run "something"

产生“命令:某事......错误:未作为命令解析”

为什么?/ 我如何解决它?

重现:

lein new eg

然后编辑生成的工程文件,添加:main eg.core定义main函数,编辑生成的src/eg/core.clj文件,粘贴进去:

核心.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 run something 没有(即打印“错误:未解决”消息)

4

2 回答 2

5

问题是当您从 lein 运行它时,您的默认命名空间是“用户”命名空间:

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

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

  1. 传递完全限定的函数名:your-namespace/something而不是something.
  2. 使用your-namespace代替*ns*(ns-resolve 'your-namespace (symbol commandname))
  3. 将命名空间更改为your-namespacein -main

方法3的例子:

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

另外,如果您想一一调用多个函数,则应使用:

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

不仅仅是大括号( (println "hello") (println "World"))

于 2013-01-16T17:55:47.513 回答
2

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

lein exec -pe '(something ...) (something-else) (save-results)'
于 2013-01-16T19:23:26.373 回答