项目级Leiningen插件

时间:2012-09-02 22:59:59

标签: 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 "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))

您可以在此处获取有关此内容的更多信息:

http://nakkaya.com/2010/02/25/writing-leiningen-plugins-101/

在2.xx中,我不能再这样做了(也就是说,我得到'foo' is not a task.对于我来说,为此任务开始一个单独的项目似乎有些过分。是仍然可以在project.clj中为leiningen 2.xx定义一个任务?

2 个答案:

答案 0 :(得分:5)

简短回答是“否”,但定义项目级别任务仍然相当容易:将:eval-in-leiningen true添加到defproject定义并将任务定义移至src/leiningen/foo.clj

答案 1 :(得分:4)

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

$ mkdir tasks
$ mv src/leiningen tasks/
$ echo tasks > .lein-classpath

您可能希望避免:eval-in-leiningen true的原因是,当您尝试为main类进行AOT编译时,它会有一些有趣的行为。具体来说,你得到:

Compilation failed: java.io.IOException: No such file or directory, compiling:(testproj/core.clj:1)

尝试编译/运行一个简单的测试示例时。更多信息请访问:

https://github.com/technomancy/leiningen/issues/769