我正在處理幾個PHP項目。一個是應用程序,另一個是支持該應用程序的庫。以前,我使用過一個mercurial setup,其中庫是應用程序庫中的子庫。這意味着對庫代碼的任何更改都被提交給子庫,並可以單獨與庫項目合併(以便將庫代碼的歷史與應用程序分開)。Bzr庫的子庫
我一直在努力尋找關於如何與Bazaar(我目前選擇的DVCS)做到這一點的例子或文檔。有沒有人試過/做過嗎?是否值得在Bzr做,或者我應該看看不同的DVCS系統以更好地滿足這種需求?
我正在處理幾個PHP項目。一個是應用程序,另一個是支持該應用程序的庫。以前,我使用過一個mercurial setup,其中庫是應用程序庫中的子庫。這意味着對庫代碼的任何更改都被提交給子庫,並可以單獨與庫項目合併(以便將庫代碼的歷史與應用程序分開)。Bzr庫的子庫
我一直在努力尋找關於如何與Bazaar(我目前選擇的DVCS)做到這一點的例子或文檔。有沒有人試過/做過嗎?是否值得在Bzr做,或者我應該看看不同的DVCS系統以更好地滿足這種需求?
Bazaar沒有subrepository特性。 [更正:顯然有一個bzr-externals插件,可用於lp:bzr-externals,雖然它模擬svn:externals特性,而不是Git子模塊或Mercurial subrepos。]
但是,這可以相當容易地解決if你不想切換版本控制系統。
將應用程序和庫放在兩個目錄中,比如app
和lib
(我假設它們是並排的,儘管它們不需要)。下面的兩個腳本,lib-snapshot
和lib-sync
然後可以將應用程序的當前版本鏈接到庫的特定版本,這將在子目錄(也稱爲lib
)的app
結賬的簽出:
LIB-快照:
#!/bin/sh
libsrc=../lib
bzr revno --tree $libsrc >libversion.txt
LIB-同步:
#!/bin/sh
ver=`cat libversion.txt`
libsrc=../lib
libdst=lib
test -d $libdst/.bzr && bzr update -q -r $ver $libdst || bzr checkout -q --lightweight -r $ver $libsrc $libdst
庫的當前版本存儲在libversion.txt
,你需要把下版本控制(以便每個版本的應用程序同步到您測試的版本)。
lib-snapshot
腳本將獲取當前檢出的庫的版本並將其存儲在libversion.txt
中。只要您認爲庫足夠穩定並且希望應用程序使用新版本,就可以使用它。然後可以使用lib-sync
腳本更新庫子目錄以包含快照版本;理想情況下,該腳本也應該用作構建/部署過程的一部分。
Bazaar會在添加文件時自動跳過包含存儲庫的目錄,但是您可能仍想將庫子目錄添加到.bzrignore
,以免受到煩人的警告。
更新:它看起來像在Bzr中有一個名爲「嵌套樹」的概念,但據我所知,它尚未完成實現(請參閱http://doc.bazaar.canonical.com/開發者/嵌套trees.html)。 希望有人糾正我(或者推薦Mercurial或Git更好地處理此用例)! –