Clojure 项目级Leiningen插件

Clojure 项目级Leiningen插件,clojure,leiningen,Clojure,Leiningen,在Leiningen版本1.x.x中,我能够定义一个仅在单个项目中有效的lein foo任务,方法是将以下内容放入该项目的project.clj: (defproject tester "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "htt

在Leiningen版本1.x.x中,我能够定义一个仅在单个项目中有效的
lein foo
任务,方法是将以下内容放入该项目的
project.clj

(defproject tester "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]])

;; Create a task, "foo"

(ns leiningen.foo
  (:require (leiningen [uberjar :as uberjar])))

(defn foo [project & args]
  (println "Do something here first, then make the uberjar.")
  (uberjar/uberjar project))
您可以在此处获得更多关于此的信息:


在2.x.x中,我不能再这样做了(也就是说,我知道“foo”不是一项任务。对于我来说,为这项任务启动一个单独的项目似乎太过了。是否仍然可以在project.clj中为leiningen 2.x.x定义一个任务?简短的回答是“否”,但定义项目级任务仍然相当容易:将
:eval in leiningen true
添加到
defproject
定义中,并将任务定义移动到
src/leiningen/foo.clj

您可以使用
.lein classpath
指向包含任务的
src
之外的目录。例如,如果您在
src/leiningen/foo.clj
中有插件,您可以在项目根目录下执行以下操作:

$ mkdir tasks
$ mv src/leiningen tasks/
$ echo tasks > .lein-classpath
您可能希望避免在leiningen true中使用
:eval的原因是,当您尝试为
main
类执行AOT编译时,它有一些有趣的行为。具体来说,您会得到:

Compilation failed: java.io.IOException: No such file or directory, compiling:(testproj/core.clj:1)
尝试编译/运行测试时,即使是一个简单的测试示例。更多信息,请访问:


对不起,没有骰子。我也找到了这个提示,在这种情况下它似乎没有任何作用。我已经用一个完整的
项目更新了我的问题。clj
来完成这个例子。谢谢你的努力。我没有意识到你的project.clj文件中有你的“foo”定义。用正确的回答更新了我的答案(希望如此)成功了!虽然有点痛苦,但还不算太糟糕。谢谢!P.s.-我还编辑了一些答案,如果我正在阅读的话,我会发现答案更清楚。希望你不介意,再次感谢!你如何指定任务所需的库/Dep?