Pages

Wednesday, April 2, 2008

virtual module in cvs

最近遇到一個小問題,在 cvs 上的檔案都是以 module 來分類,如果有一個 project 組裝了多個 module,每次要 co 下來總是麻煩。最簡單的方式就是把這些 module 通通搬進同一個目錄,這樣只要把 root module 拉下來就可以了。但是偶爾也會遇到 sub module 被多個 project 所組裝,這時不是將共用的 sub module 多複製幾份,就是把所有 project 都丟進同一個 root module (我知道這種方法蠢到爆...)。

為了管理上的方便,這幾天照著文件測試一下,果然有類似 virtual module 的設定可以用,不過在文件上用的不是 virtual module 這名字,而是 ampersand module。

這東西的概念很簡單,只要在定義出 root module 需要參考的其他 module 就可以了,這個 root module 指的是 co 時後面接的 module name,可以不用是實際存在的 module (我把這種定義出來的稱為 virtual module)。在 co 時會先下載原本的 module (如果是實體 module 的話),接著再把參考到的 module 一併 checkout 到 root module 目錄內。

設定的方式是到 server 端編輯 ${CVSROOT}/CVSROOT/modules 這個檔案。假設 repo 內已經存在 liba、libb、libc,有一個 proj module 需要參考到這三個函式庫,可以這樣設定:

proj &liba &libb &libc

就是這麼簡單,只要在參考的 module name 前加上 ''&'' (ampersand) 就好,往後只要 cvs co proj 就可以在 proj 目錄看到 liba libb libc 了。要注意的是這個定義似乎允許 nested reference,例如這樣的設定:

proj &liba &libb &libc liba &libb

在 co proj 後會發現 libb 也會出現在 liba 目錄中 (多下載一份),所以真的要用的話得仔細規劃各個 module 之間的相依關係。

文件上有提到一個限制,所有組裝與被組裝的 module 都要在同一個 repo 裡,沒辦法參考到存在其他 repo 的 module (下載後只會記錄一個 CVSROOT)。不過只要程式碼都是自己的,這個限制就不是什麼大問題了。

其實在 ${CVSROOT}/CVSROOT 底下還有不少 hook script 可以玩,有時間再來仔細研究。


This article was originally posted on this site.

No comments:

Post a Comment