在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定义一个任务?
答案 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)
尝试编译/运行一个简单的测试示例时。更多信息请访问: