我如何依赖于每个Clojure贡献库?

7

我曾经喜欢包含所有的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库都放在classpath上,不管我是否需要它们。考虑到版本号等问题,我认为这可能会非常麻烦。请问有更好的方法吗?编辑:如果有一个包含库名称和当前版本的网页,我可以很容易地将其转换为项目文件。
2个回答

8

如果你只是想在REPL中运行它的话(这似乎是唯一适用的用例,对吧?),你可以使用石榴。你可以让它使用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上找到,其中也可以找到使用说明。


我的天啊!我甚至没有意识到这在原则上是可能的,而你给了我能够实现它的工作代码。通常我会在我的博客(http://www.learningclojure.com)上写一些关于这个的内容,但显然这是你的想法,所以如果你愿意的话,我就把这个机会留给你了。如果你写了相关内容,请告诉我,这样我就可以链接到你的文章了。如果你不想写,那我可以写吗? - John Lawrence Aspden
另外,我认为你应该将这个变成一个Clojars项目。如果你不想的话,那我可以做吗? - John Lawrence Aspden
谢谢,约翰!回答这个问题和想出一个解决方案真的很有趣。 :) - rplevy
1
我不介意将其作为一个项目创建和维护。我会尝试在今天晚些时候处理它。 - rplevy
1
好的,我会做的,请告诉我!与此同时,我已经发现它非常有用,特别是因为我正在使用lein 2,所以如果需要,石榴就一直在那里。谢谢。 - John Lawrence Aspden

1

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