|
|
1
2
这听起来就像
sub repository support
在mercurial中是为。如果项目A和项目B等是独立的存储库,您可以在解决方案1和2中使它们成为子回购
|
|
|
2
3
考虑为什么应用程序需要使用不同版本的库。如果您正确地设计了库,并确保在升级库时不会破坏任何东西(使用连续集成和单元测试,以及测试所有相关项目),那么在大多数情况下,最好(最简单、最干净)的方法就是让所有应用程序运行在相同版本的库上。我甚至想说,如果您的应用程序不能运行相同的库版本,这说明您的库没有得到正确的设计/实现/维护,您应该重新考虑您的方法。
我建议将库项目移动到库中。您的图表显示了应用程序解决方案构建库代码并将其向上推到库中,然后将构建的库文件向下吸回到项目中-双向复制,eek!只需将库项目放在库中并构建库,然后从您的项目中引用该库-一个单向副本。您可能认为这意味着您必须构建两个解决方案(库,然后是应用程序),但实际上您可以随时在应用程序解决方案中添加/删除库项目,因此此布局不需要两阶段构建过程。但库和应用程序之间的逻辑区别要清晰得多。 |
|
|
3
3
我的解决方案。我们使用克隆的组合 和 我们所做的是为我们的每个库建立一个核心存储库,其中包含该库的主线分支。创建新应用程序时,我们将所有相关库(每个库使用一个mercurial repo,其中一个库可能包含库及其测试应用程序)克隆到新应用程序旁边的目录中,并引用该应用程序中的库。
每当我们接触一个应用程序时,我们可以选择是继续使用旧库,还是更新到库的最新主线版本(甚至是另一个项目开发版本)。库更改并不是推送到每一个使用它们的应用程序上(有些可能是多年没有接触过的遗留应用程序,并且与它们所使用的库配合良好),它们是由在给定版本的库中需要新功能的应用程序引入的。 我为什么要这样做?我在这里试图避免的问题是我在以前的公司经常遇到的问题。 我会让我的应用程序与给定的库一起工作。其他人会为他们的应用程序更改库,这样它就可以满足他们的需要,下次我去编辑我的项目时,它就不会编译了。然后,我将不得不花时间按照库现在想要的方式修复我的项目,或者花时间恢复对库所做的不适当的更改(然后将级联回其他开发人员)。 使用本地项目克隆,每个应用程序都可以在更新到更新的库版本时进行选择,从机会管理的角度来看,我们可以在库被合并回主线之前,检查由于应用程序需求而对库所做的更改。
针对这些难以实现的目标的具体解决方案。
通过将库克隆到靠近应用程序的目录中,您可以获得一组存储库,这些存储库可以一起管理,并可能最终很好地转换为“应用程序”超级repo的子repo。 我使用存储在应用程序目录中的一堆批处理文件来实现这一点。 例如,给定的应用程序“_projects.bat”可能包含:
然后,我有批处理文件来执行有用的同步操作,比如检查将使用“\uuu incoming.bat:
并检查用“\uuuu outgoing.bat”推送的内容:
或者实际使用“uuu push.bat”执行这些操作:
和“uuu pull.bat”:
当“_update.bat”将所有内容更新为最新版本时(在同一分支内,您仍然需要在当前分支外显式更新):
我最喜欢的一个是“_id.bat”,它显示了当前正在使用的变更集(和分支)以及它们是否有未完成的未注释变更:
每当我开始进行应用程序更新时,我都会检查是否有更新的库,下拉所有适当的内容,更新到我想要的版本,然后继续开发。
未来的选择。最终,我希望通过使用子repos(因此整个应用程序及其所有库的状态都记录在一个应用程序变更集中)来完全自动化这个工作流,但是尽管它在Mercurial中变得非常稳定,但TortoiseHG集成似乎并不是一个优先事项。上次尝试时,我无法让THG提交工具做任何有用的事情(大约0.8.3)。我真的应该用0.9.3重新测试,但我不记得在变更日志中看到过任何关于次级回购的注释,所以除非人们告诉我已经悄悄添加了次级回购支持,否则就不值得了。 事实上,批处理文件工作得很好。我的待办事项列表上的下一件事是一个“\uuu clone.bat”,这将使克隆应用程序及其所有库变得更加容易,但我还没有时间让它正常工作。
做记号 |
|
|
4
0
我不确定我是否理解你“图书馆”的目的? 为什么这两个解决方案实际上没有引用同一个项目而不是一个副本? 如果目的是能够在“库”的不同分支上工作,那么您所描述的是由SVN之类的源代码控制软件处理的事情。
|
|
|
5
0
对不起,我没有读完这一页的全文。但是简单的回答是: VisualStudio可以实现所有必要的自动化 . 我们有相似的结构。解决方案1、解决方案2和包含多个项目的公共库。我们在SVN下的文件夹结构如下:
禁止复制
在这里两种解决方案都只是参考了
PS:再看看这个软件 http://svnnotifier.tigris.org/ 它可以自动(通过计时器)或通过鼠标单击更新任意数量的存储库本地副本。 |