我们在我们公司做的是建立一个工具存储库,然后项目存储库。该工具库是Subversion版本库,安排如下:
/svn/tools/
vendor1/
too11/
1.0/
1.1/
latest = a copy of vendor1/tool1/1.1
tool2/
1.0/
1.5/
latest = a copy of vendor1/tool2/1.5
vendor2/
foo/
1.0.0/
1.1.0/
1.2.0/
latest = a copy of vendor2/foo/1.2.0
每次我们得到供应商的工具的新版本,它是根据其供应商,名称添加和版本号,以及'最新'标签已更新。
[说明:这不是一个典型的源代码库 - 它的目的是存储特定版本的'已安装'图像。因此/svn/tools/nunit/nunit2/2.4将是包含将NUnit 2.4安装到目录并将其导入工具存储库的结果的目录树顶部。可能存在源代码和示例,但主要关注的是使用该工具所必需的可执行文件和库。如果我们需要修改供应商工具,我们会在单独的存储库中执行此操作,并将结果发布到此存储库。 ]
其中一个供应商是我公司,并有每个工具,组装,无论我们在内部发布一个单独的部分。
的项目库是一个标准的Subversion版本库,与树干,标签,树枝和你通常的预期。任何给定的项目将是这样的:
/svn/
branches/
tags/
trunk/
foo/
source/
tools/
publish/
foo-build.xml (for NAnt)
foo.build (for MSBuild)
的工具目录下有一个颠覆的svn:externals的属性集,在相应的版本链接的每个工具或组装的(或者是特定的版本或“最新”),其该项目需要。当'foo'项目由CruiseControl构建时。NET,发布任务将填充“发布”目录作为“富”组件预定部署,然后执行以下颠覆命令:
svn import publish /svn/tools/vendor2/foo/1.2.3
svn delete /svn/tools/vendor2/foo/latest
svn copy /svn/tools/vendor2/foo/1.2.3 /svn/tools/vendor2/foo/latest
开发人员在他们的项目中正常工作,并让构建自动化负责细节。正常的颠覆更新将拉动最新版本的外部工具以及项目更新。
如果你有很多工具相互依赖性,你可以配置CruiseControl.NET(手工)来触发它们的依赖关系发生变化时从属项目的构建,但我们并不需要那么做。
注意:为清晰起见,所有Subversion存储库路径都缩短了。我们实际上使用Apache + SVN和两个独立的服务器,但是您应该按照您认为合适的方式进行调整。
这看起来像一个非常好,干净的方式 - 从我+1 +1 – 2008-09-20 13:35:43