2

假设一个大型项目被拆分为多个项目,每个项目都位于一个单独的 Mercurial 存储库中(根据在 Mercurial 中组织具有共享依赖项的项目的好方法是什么?)。

还假设在内部使用依赖管理器(我们使用的是 NuGet,但同样适用于 Maven),这样:

  • ProjectA 依赖于 Ninject 和 MongoDB
  • ProjectB 依赖于 ProjectA 和 log4net

A、B项目可以独立搭建;NuGet 会自动从 NuGet 服务器(在本例中为 ProGet)下载 OSS 和内部依赖项。

最后假设 ProjectB 依赖于 ProjectA 的 v1.2.3.4-SNAPSHOT,并且 CI 服务器不断更新 NuGet 服务器中的 ProjectA.1.2.3.4-SNAPSHOT 包。因此,ProjectB 将始终根据 ProjectA 的最新签入更改进行开发。

如果项目 A 和 B 都需要相关更改怎么办?有什么巧妙而巧妙的方法可以正确地做到这一点?一些想法:

  • 开发人员签出项目 A 和 B。对 A 进行更改、构建和签入。开发人员等待 CI 服务器构建和更新 NuGet 服务器。对 B 进行了更改、构建和签入。(我不喜欢这样做,因为代码正在作为开发过程的一部分进行签入。)
  • 开发人员检查项目 A 和 B,并重新连接 B 以使用 A 源作为依赖项(而不是 NuGet 包 ProjectA)。对 A 和 B 都进行了更改。在适当的测试后,对 A 和 B 一起执行签入,但开发人员必须确保不签入依赖项更改。

我不是特别擅长这个,所以我认为有人会用一些非常聪明的东西把我的想法从水中吹走。

4

2 回答 2

0

我不知道 NuGet 是如何做到的,但是对于 Maven,您的第二个想法可以正常工作,除了“重新连接 B 以使用 A 源作为依赖项”是不必要的。您只需在本地构建 A(使用install),它就会安装到您本地的 Maven 存储库中。然后在构建 B 时,它会选择新构建的 A,而不是来自中央仓库的那个。

于 2012-08-02T08:14:02.687 回答
0

我可以用 nuget 想到以下内容: 在项目 A 中,将包放在中心位置(在本例中,我将其放在 c:\localpackages 中)


使用 MSBUILD.exe /t:Build,Package A.csproj 构建 A

使用项目 B,您可以添加一个 .nuget\nuget.config 指定(您可以在此处阅读有关指定包文件夹位置的更多信息http://docs.nuget.org/docs/release-notes/nuget-2.1)这应该选择项目 A 所做的更改。当您为 A 删除了不同版本的 nuget 包时,这可能会变得很棘手

希望这可以帮助。

于 2012-10-12T04:46:11.490 回答