项目级Leiningen插件(Project-level Leiningen Plugin)

2019-07-31 07:28发布

在Leiningen版本1.XX我能够定义一个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内的任务吗?

Answer 1:

简短的回答是“不”,但它仍然是相当容易的定义项目级任务:添加:eval-in-leiningen true到你defproject定义和任务定义移动到src/leiningen/foo.clj



Answer 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



文章来源: Project-level Leiningen Plugin