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

yay*_*wei 7 build-process clojure

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

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

Joh*_*den 8

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

user> (require 'incanter.core)
nil
Run Code Online (Sandbox Code Playgroud)

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

user> (incanter.core/matrix? 2)
false
Run Code Online (Sandbox Code Playgroud)

我们可以看一下原始的源代码:

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 
Run Code Online (Sandbox Code Playgroud)

我们去吧搞砸了:

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

user> (in-ns 'incanter.core)
#<Namespace incanter.core>
Run Code Online (Sandbox Code Playgroud)

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

incanter.core> (defn matrix? [obj] "hello")
#'incanter.core/matrix?
Run Code Online (Sandbox Code Playgroud)

单元测试:

incanter.core> (matrix? 2)
"hello"
Run Code Online (Sandbox Code Playgroud)

切换回用户命名空间:

incanter.core> (in-ns 'user)
#<Namespace user>
Run Code Online (Sandbox Code Playgroud)

试试看:

user> (matrix? 2)
; Evaluation aborted.
Run Code Online (Sandbox Code Playgroud)

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

user> (incanter.core/matrix? 2)
"hello"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有了maven项目,就应该这么简单

$ mvn install
Run Code Online (Sandbox Code Playgroud)

关于版本号的说明:

如果您确实进行了永久性修改并使用依赖关系管理来协调差异,那么您应该更改库的版本号,从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,然后再在顶级目录中运行,你必须按顺序执行.我不太明白为什么.

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