如何使用我自己的Clojure库版本?

时间:2010-09-21 07:36:47

标签: clojure build-process

假设我对Clojure库进行了更改(例如,在clj-oauth中向请求令牌添加了一个参数),并希望在我的项目中使用该更改的库。除了将新库编译为JAR并将其复制到我的项目库之外,最好的方法是什么?

我希望能够同时调整库和我的项目(最好是在REPL中)。如果我在Ruby中这样做,我会下载并“需要”gem,然后在我自己的项目源中重新打开该类,并根据需要添加或覆盖这些方法。

3 个答案:

答案 0 :(得分:7)

你可以直接破解REPL。假设你已经在你的类路径上闯入了。 启动REPL。我们需要做的第一件事就是将incanter类带入其中。

user> (require 'incanter.core)
nil

现在我们可以看到函数incanter.core / matrix?

user> (incanter.core/matrix? 2)
false

我们可以查看原始源代码:

user> (require 'clojure.repl)
nil
user> (clojure.repl/source incanter.core/matrix?)
(defn matrix?
  " Test if obj is 'derived' incanter.Matrix."
  ([obj] (is-matrix obj)))
nil 

让我们把它搞砸了:

首先更改为incanter.core命名空间:

user> (in-ns 'incanter.core)
#<Namespace incanter.core>

然后我们可以使用旧的源代码作为婴儿床重新定义它:

incanter.core> (defn matrix? [obj] "hello")
#'incanter.core/matrix?

单元测试:

incanter.core> (matrix? 2)
"hello"

切换回用户名称空间:

incanter.core> (in-ns 'user)
#<Namespace user>

尝试一下:

user> (matrix? 2)
; Evaluation aborted.

没有用户/矩阵的定义。我们在incanter.core命名空间中重新定义了它。

user> (incanter.core/matrix? 2)
"hello"

为了在repl上进行实验,只需更改源文件并重新编译单个文件(emacs中的CC Ck),或者如果您在正确的命名空间中,只需重新评估定义。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

现在,如果我们想让我们的宝贵变革永久化并可供其他项目使用,那么这取决于所有设置的方式。

我使用maven进行依赖关系管理,因此这将是修改源文件,然后重新运行库的构建过程以编译新版本并将其安装到本地maven存储库中的问题。

使用maven项目,应该像

一样简单
$ mvn install

关于版本号的说明:

如果您确实进行了永久性修改并使用依赖关系管理来协调差异,那么您应该更改库的版本号,从1.2.0到1.2.0-johnshack-SNAPSHOT,或者不太可能发生碰撞的事情。当你想在另一个项目中使用未经修改的版本时,真实的东西。您不希望修改后的版本进入不受欢迎的项目。

然后,您修改自己的项目文件,以确保您在任何地方使用被黑客入侵的版本,并在下次启动您的repl时,它应该引入您安装的最后一个hack。

每当您希望更改进入存储库时,您将需要重新安装,但这实际上可能是一件好事。

不幸的是,(此时我开始希望我选择了另一个例子)Incanter原来是一个leiningen项目,它以特定的脚本方式分成子模块,所以我们需要弄清楚它是如何安装的。尽管答案很简单,但弄清楚结果却很难。莱宁根把头发放火了。

你可以在这里获得incanter的来源:

$ git clone http://github.com/liebke/incanter.git

,相关的源文件是:

〜/咒术/模块/咒术核/ SRC /咒术/ core.clj

修改它以打破矩阵?功能,然后事实证明你要做的是:

更改顶级project.clj以及子模块project.clj中的版本号。

然后在incanter-core目录中运行lein install,然后再在顶级目录中运行,您必须按此顺序执行此操作。我不太明白为什么。

目前这一切似乎都是不必要的复杂化。我(相当)确定它会随着工具的成熟而稳定下来。

答案 1 :(得分:4)

如果您正在使用(或不介意使用)cake,请查看自述文件的子项目依赖项部分。我想这可能正是你所寻找的。

答案 2 :(得分:-1)

您可以根据不同的名称将其上传到clojars。