我正在做几个PHP项目。一个是应用程序,另一个是支持该应用程序的库。以前我使用的是mercurial设置,其中库是应用程序存储库中的子存储库。这意味着对库代码的任何更改都被提交到子存储库,并且可以单独与库项目合并(以便使库代码的历史记录与应用程序分开)。
我一直在努力寻找如何用Bazaar(我目前选择的DVCS)做到这一点的例子或文档。有人试过吗?是否值得在Bzr中这样做,或者我是否应该考虑另一种能够更好地满足这一需求的DVCS系统?
Bazaar没有子存储库特性。[更正:显然有一个bzr-externals插件,可在lp:bzr-externals,虽然它模拟svn:externals功能,而不是Git子模块或Mercurial子reppos。]
但是,如果您不想切换版本控制系统,则可以相当容易地解决这个问题。
将应用程序和库放在两个目录中,比如app
和lib
(这里我假设它们是并排的,尽管它们不必并排)。然后可以使用以下两个脚本lib-snapshot
和lib-sync
将应用程序的当前版本链接到库的特定版本,该版本将在app
签出的子目录(也称为lib
)中签出:
lib-snapshot:
#!/bin/sh
libsrc=../lib
bzr revno --tree $libsrc >libversion.txt
lib-sync:
#!/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
,以便您不会收到烦人的警告。