cod*_*yzu 11 mercurial shared-libraries dependency-management mercurial-subrepos
我们用C#开发.NET Enterprise软件.我们正在寻求改进我们的版本控制系统.我之前使用过mercurial并且一直在我们公司进行实验.但是,由于我们开发企业产品,因此我们非常关注可重用的组件或模块.我一直在尝试使用mercurial的子repos来管理组件和依赖,但是遇到了一些困难.以下是源代码管理/依赖关系管理的基本要求:
这是我一直在使用的mercurial结构:
SHARED1_SLN-+-docs
|
+-libs----NLOG
|
+-misc----KEY
|
+-src-----SHARED1-+-proj1
| +-proj2
|
+-tools---NANT
Run Code Online (Sandbox Code Playgroud)
SHARED2_SLN-+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----SHARED2-+-proj3
| +-proj4
|
+-tools---NANT
Run Code Online (Sandbox Code Playgroud)
PROD_SLN----+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-SHARED2-+-proj3
| | +-proj4
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----prod----+-proj5
| +-proj6
|
+-tools---NANT
Run Code Online (Sandbox Code Playgroud)
如果Bob正在处理PROD1并且Alice正在使用SHARED1,那么Bob如何知道Alice何时提交对SHARED1的更改.目前,对于Mercurial,Bob被迫在每个子目录中手动拉取和更新.如果他从PROD_SLN repo推送/拉到服务器,他从不知道subrepos的更新.这在Mercurial wiki中有所描述.当Bob从服务器中提取最新的PROD_SLN时,如何通知Bob subrepos的更新?理想情况下,应该通知他(最好在拉动期间),然后必须手动决定他想要更新哪个子目录.
假设SHARED1引用NLog v1.0(mercurial中的commit/rev abc)和SHARED2引用Nlog v2.0(mercurial中的commit/rev xyz).如果Bob在PROD1中吸收这两个组件,他应该意识到这种差异.虽然在技术上的Visual Studio/.NET将允许2个组件引用不同版本的依赖关系,因为路径NLOG是固定的,依赖于NLOG所有的.NET项目,我的结构不允许这样.鲍勃怎么知道他的两个依赖项有版本冲突?
如果Bob正在为PROD1设置存储库结构并希望包含SHARED2,那么他如何知道SHARED2需要哪些依赖项?使用我的结构,他必须手动克隆(或在服务器上浏览)SHARED2_SLN repo,并查看libs文件夹,或者在.hgsub文件中达到峰值,以确定需要包含哪些依赖项.理想情况下,这将是自动化的.如果我在我的产品中包含SHARED2,也会自动包含SHARED1和NLog,如果存在与其他依赖项的版本冲突,请通知我(参见上面的问题2).
mercurial是正确的解决方案吗?
有更好的mercurial结构吗?
这是subrepos的有效用途(即Mercurial开发人员将subrepos标记为最后的特征)?
使用mercurial进行依赖管理是否有意义?我们可以使用另一个工具进行依赖关系管理(可能是内部的NuGet提要?).虽然这对于第三方依赖项很有效,但它确实会为内部开发的组件带来麻烦(即如果它们是积极开发的,开发人员必须不断更新feed,我们必须在内部提供它们,并且它不允许消费项目要修改的组件(注8和问题2).
您是否有更好的Enterprise .NET软件项目解决方案?
我已经阅读了几个SO问题并发现这个问题很有用,但是接受的答案建议使用专用的依赖工具.虽然我喜欢这种工具的功能,但它不允许从消费项目中修改和提交依赖项(参见更大的问题4).
Cla*_*rae 12
这可能不是您正在寻找的答案,但我们最近有使用子回购的Mercurial新手用户的经验,我一直在寻找机会传递我们的经验......
总之,我根据经验提出的建议是:无论Mercurial子回购都有吸引力,不要使用它们.相反,找到一种并排布局目录的方法,并调整构建以应对这种情况.
无论如何吸引人的似乎是将子仓库中的修订与父仓库中的修订捆绑在一起,它只是在实践中不起作用.
在转换的所有准备过程中,我们收到了来自多个不同来源的建议,即子回购是脆弱的并且没有很好地实现 - 但我们仍然继续前进,因为我们想要回购和子回购之间的原子提交.建议 - 或者我对它的理解 - 更多地谈论了原则而不是实际后果.
只有在我们与Mercurial和子回购公司合作之后,我才能真正理解这些建议.这里(来自记忆)是我们遇到的各种问题的例子.
所有这些事情在专家用户手中都很烦人 - 但是当你向新手用户推出Mercurial时,它们是一场真正的噩梦,也是浪费时间的浪费源头.
所以,我花了很多时间用子仓库进行转换,几周后我们将子仓库转换为回购.因为我们在通过.hgsubstate引用子回购的转换中有大量的历史记录,所以它给我们带来了更复杂的东西.
我只希望我真的很感激早期所有建议的实际后果,例如Mercurial的最后度假胜地页面:
但我需要管理子项目!
再说一次,不要那么肯定.像Mozilla这样具有大量依赖关系的重要项目在没有使用子版本的情况下做得很好.如果不使用subrepos,大多数小型项目几乎肯定会更好.
编辑:关于shell回购的想法
有了免责声明,我对他们没有任何经验......
不,我不认为他们中的很多人都是.您仍然在使用子回购,因此所有相同的用户问题都适用(除非您可以为每个步骤提供包装脚本,当然,除去人类需要提供正确的选项来处理子回购.)
另请注意,您引用的Wiki页面列出了shell repos的一些特定问题:
- 过度严格跟踪project /和somelib /之间的关系
- 无法检查或推送项目/如果somelib/source repo成为
- 缺乏对递归diff,log和的明确定义的支持
- 状态递归性质令人惊讶
编辑2 - 进行试用,涉及所有用户
我们真正开始意识到我们遇到问题的一点是,一旦多个用户开始提交,拉动和推动 - 包括对子仓库的更改.对我们来说,回应这些问题在当天为时已晚.如果我们早点了解它们,我们可以更轻松,更简单地做出回应.
所以在这一点上,我认为我能提供的最佳建议是建议您在布局刻在一块之前进行项目布局的试运行.
我们离开了全面的审判,直到为时已晚,无法进行更改,即使这样,人们只对父回购进行了更改,而不是子回购 - 所以我们仍然没有看到全貌,直到为时已晚.
换句话说,无论您考虑什么布局,在该布局中创建存储库结构,并让很多人进行编辑.尝试将足够的真实代码放入各种repos/sub-repos中,以便人们可以进行真正的编辑,即使它们是抛出的.
可能的结果: