【问题标题】:How do I depend on every clojure contrib library?我如何依赖每个 clojure contrib 库?
【发布时间】:2012-11-20 07:39:47
【问题描述】:

我以前喜欢包含所有的 clojure.contrib,并且需要所有的库。这使得 find-doc 作为发现工具非常有用。

现在(clojure 1.4)clojure.contrib 被分成许多子库。这反而破坏了我的计划,这也意味着我每次需要新库时都必须不断地重新启动 JVM。

所以我正忙着构建一个包含很多行的 project.clj 文件:

[org.clojure/algo.generic "0.0.6"]
....
[org.clojure/data.xml "0.0.4"]
....

这样我就可以让 leiningen 将每个 clojure contrib 库放在类路径中,无论我是否需要它们。

而且我认为这将是一个巨大的痛苦,版本号等等。

我想知道是否有人有更好的方法来做同样的事情?

编辑:考虑一下,如果某处有一个包含库名称和当前版本列表的网页,我可以很容易地将其转换为项目文件。

【问题讨论】:

    标签: clojure classpath leiningen clojure-contrib


    【解决方案1】:

    如果您只想在 REPL 中运行它,您可以使用 pomegranate(这似乎是唯一合适的用例,对吧?)。您可以让它使用 Maven Central API 查找最新版本。我认为这比维护某种依赖项项目要好,无论是生成的还是其他的。

    (require '[cemerick.pomegranate :refer [add-dependencies]])
    
    (add-dependencies
      :coordinates '[[clj-http "0.5.8"]]
      :repositories {"clojars" "http://clojars.org/repo"})
    
    (require '[clj-http.client :as client])
    
    ;; contrib project names from https://github.com/clojure
    (def contrib ["tools.nrepl" "tools.trace" "tools.namespace" "tools.macro"
                  "test.generative" "math.numeric-tower" "core.match" "core.logic"
                  "data.priority-map" "core.contracts" "tools.cli" "java.jmx"
                  "java.jdbc" "java.classpath" "data.xml" "data.json" "core.unify"
                  "core.incubator" "core.cache" "algo.monads" "data.generators"
                  "core.memoize" "math.combinatorics" "java.data" "tools.logging"
                  "data.zip" "data.csv" "algo.generic" "data.codec"
                  "data.finger-tree"])
    
    (defn add-contrib-dependencies
      "look up the latest version of every contrib project in maven central,
       and add them as dependencies using pomegranate."
      [project-names]
      (add-dependencies
       :coordinates
       (map (juxt
             (comp symbol (partial format "org.clojure/%s"))
             (fn [proj]
                 (Thread/sleep 100)
                 (-> "http://search.maven.org/solrsearch/select?q=%s&rows=1&wt=json"
                     (format proj)
                     (client/get {:as :json})
                     :body :response :docs first :latestVersion)))
            project-names)))
    

    现在您可以在项目名称列表中调用此函数:

    user=> (add-contrib-dependencies contrib)
    {[org.clojure/data.zip "0.1.1"] nil,
     [org.clojure/java.classpath "0.2.0"] nil,
     [org.clojure/core.cache "0.6.2"] nil, ...}
    

    更新:如前所述,我已将此答案放入库中。它可以用作 nREPL 中间件,也可以从正在运行的 REPL 会话中手动调用。代码可以在https://github.com/rplevy/contrib-repl找到,这里也可以找到使用说明。

    【讨论】:

    • 天哪!我什至没有意识到这在原则上是可能的,你给了我可以做到的工作代码。我通常会在博客上讨论这个(learningclojure.com),但这显然是你的想法,所以如果你愿意,我会把它留给你。如果你把它写下来,你能告诉我吗,以便我可以链接到你的文章?或者如果你不想,那我可以吗?
    • 另外,我认为你应该把它做成一个关于clojars的项目。如果你不想,那你介意我做吗?
    • 谢谢,约翰!我很高兴回答这个问题并想出了一个解决方案。 :)
    • 我不介意将它作为一个项目来创建和维护。我会在今天晚些时候尝试解决。
    • 会做的,告诉我!与此同时,我已经发现它非常有用,尤其是当我使用 lein 2 时,所以如果我需要它,石榴总是在那里。谢谢。
    【解决方案2】:

    我感觉到你的痛苦。应该会有帮助http://dev.clojure.org/display/community/Where+Did+Clojure.Contrib+Go

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 2012-07-07
      相关资源
      最近更新 更多