2010-09-21 56 views
6

假設我對Clojure庫進行了更改(例如,在clj-oauth中向請求標記添加了一個參數),並且希望在我的項目中使用更改後的庫。什麼是最好的方式來做到這一點,短的編譯新庫作爲JAR和複製到我的項目庫?如何使用我自己的Clojure庫版本?

我希望能夠同時調整庫和我的項目(最好在REPL中)。如果我在Ruby中這樣做,我會下載並「需要」gem,然後在我自己的項目源中重新打開該類,並根據需要添加或覆蓋方法。

回答

6

您可以直接在REPL上進行破解。假設你的班級路徑上有甕中之鱉。 開始REPL。我們需要做的第一件事就是將甕器類帶入其中。

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試驗,它的確定只是更改源文件並重新編譯單個文件(CC CK在Emacs),或者如果你在正確的命名空間的時候,只需重新評估的定義。

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

現在,如果我們想讓我們的寶貴變化永久並可用於其他項目,這取決於如何設置一切。

我使用maven進行依賴管理,所以這將是修改源文件的問題,然後重新運行庫的生成過程以編譯新版本並將其安裝到本地maven存儲庫中。

隨着Maven項目,這應該是作爲

$ mvn install 

關於版本號的說明一樣簡單:

如果你做永久的修改和使用相關管理協調分歧,那麼你應該改變你的庫的版本號,從也許1.2.0至1.2.0-johnshack快照或東西時,要在其他項目中使用的unperverted版本,是不可能與真品碰撞。你不希望修改後的版本找到進入項目中是不歡迎的。

然後修改自己的項目文件,以確保您使用要在下一次啓動REPL的黑客版,以及,它應該拉你最後安裝的黑客。

你需要你想你的變化,使他們的方式進入倉庫,每次重新安裝,但實際上可能是一個很好的事情。

不幸的是,(現在我已經開始希望自己選擇了一個不同的例子),Incanter變成了一個leiningen項目,它以特殊的腳本方式分成子模塊,所以我們需要弄清楚它是如何安裝的。儘管答案很簡單,但事實證明這很難。萊寧根把我的頭髮着火了。

你可以得到咒術源位置:

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

和相關的源文件是:

〜/咒術/模塊/咒術核心/ src目錄/咒術/核心。 CLJ

修改它打破矩陣?功能,然後事實證明你需要做的是:

更改頂級project.clj和子模塊project.clj中的版本號。

然後運行雷音再次在頂級目錄安裝在咒術核心目錄,然後,你必須做的順序。我不太明白爲什麼。

目前所有這些似乎都是不必要的複雜。我(相當)相信,隨着工具的成熟,它會穩定下來。

4

如果您正在使用(或不介意使用)cake,請查閱自述文件的子項目依賴關係部分。我想這可能正是你想要的。

-1

你上傳到clojars根據不同的名稱。

+1

或使用本地Maven存儲庫 – Greg 2010-09-21 12:48:11

+0

使用Leiningen,可以使用'lein install'完成此操作。 – Mars 2014-12-22 05:00:35

相關問題