gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:58:07 24 4
gpt4 key购买 nike

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

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

最佳答案

你可以直接在 REPL 上破解。假设你的类路径中有 incanter。
开始一个 REPL。我们需要做的第一件事是将咒术师类(class)带入其中。

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 中的 C-C C-k)即可,或者如果您在正确的命名空间中,只需重新评估定义即可。

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

现在,如果我们想让我们有值(value)的更改永久化并可供其他项目使用,这取决于一切的设置方式。

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

使用 Maven 项目,这应该很简单
$ mvn install

关于版本号的说明:

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

然后你修改你自己的项目文件以确保你使用你想要的破解版本,并且下次启动你的 repl 时,它应该拉入你安装的最后一个 hack。

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

不幸的是,(正是在这一点上,我开始希望我选择了一个不同的例子)Incanter 原来是一个 leiningen 项目,它以一种特别的脚本方式分成子模块,所以我们需要弄清楚它的预期安装方式。虽然答案很简单,但结果证明是相当困难的。莱宁根点燃了我的头发。

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

$ git 克隆 http://github.com/liebke/incanter.git

相关的源文件是:

~/incanter/modules/incanter-core/src/incanter/core.clj

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

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

然后你在 incanter-core 目录中运行 lein install ,然后在顶级目录中再次运行,你必须按照这个顺序来做。我不太明白为什么。

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

关于clojure - 如何使用我自己的 Clojure 库版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com