Плагин 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?

Ответ 1

Короткий ответ - "нет", но довольно сложно определить задачу уровня проекта: добавьте :eval-in-leiningen true в определение defproject и переместите определение задачи на src/leiningen/foo.clj.

Ответ 2

Вы можете сделать это, используя .lein-classpath, чтобы указать на каталог вне src, содержащий задачи. Например, если у вас есть плагин в src/leiningen/foo.clj, вы можете сделать это в корне проекта:

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

Причина, по которой вам может понадобиться избегать :eval-in-leiningen true, заключается в том, что она имеет некоторые забавные поведения, когда вы пытаетесь сделать компиляцию AOT для класса main. В частности, вы получаете:

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

При попытке скомпилировать/запустить даже простой пример тестирования. Дополнительная информация:

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