【问题标题】:Project-level Leiningen Plugin项目级 Leiningen 插件
【发布时间】:2012-09-02 22:59:58
【问题描述】:

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

(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. 这似乎对我来说太过分了,不得不为这项任务启动一个单独的项目。它仍然是可以在 project.clj 中为 leiningen 2.x.x 定义任务吗?

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

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

    【讨论】:

    • 对不起,没有骰子。我也找到了那个提示,在这种情况下它似乎没有做任何事情。我已经用完整的project.clj 更新了我的问题以完成示例。感谢您的努力。
    • 我没有意识到您的 project.clj 文件中有您的“foo”定义。用正确的答案更新了我的答案(希望如此)
    • 做到了!这有点痛苦,但还不算太糟糕。谢谢!
    • P.S. - 我还编辑了一些我在阅读时会发现更清楚的答案。希望您不要介意,再次感谢!
    【解决方案2】:

    您可以通过使用.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

    【讨论】:

    • 如何指定任务所需的库/deps?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2012-11-21
    相关资源
    最近更新 更多