项目级Leiningen插件

11

在Leiningen 1.x.x版本中,我可以通过将以下内容放入该项目的project.clj文件中来定义仅在单个项目中有效的lein foo任务:

```clojure :profiles {:dev {:plugins [[lein-foo "0.1.0-SNAPSHOT"]]} ```
```clojure :plugins [[lein-foo "0.1.0-SNAPSHOT"]] ```
(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.x.x版本中,我不再能够做到这一点(即我会收到 'foo' is not a task. 的错误信息)。对于我来说,为此任务启动一个单独的项目似乎有些过度了。 在Leiningen 2.x.x中是否仍然可以在project.clj中定义任务?

2个回答

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

抱歉,不行。我也发现了那个提示,但在这种情况下似乎没有任何作用。我已经更新了我的问题,并提供了完整的 project.clj 以完成示例。感谢您的努力。 - charleslparker
我没有意识到你在project.clj文件中定义了你的“foo”。已经更新了我的答案,希望是正确的。 - DanLebrero
搞定了!虽然有点麻烦,但还好。谢谢! - charleslparker
PS:我还编辑了答案,让它更加清晰易懂。希望你不介意,再次感谢! - charleslparker

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

6
你如何指定任务所需的库和依赖项? - oshyshko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接