使用绝对路径构建依赖关系

时间:2013-04-09 04:43:03

标签: c# c++ build external dependency-management

目前我们使用Source Safe并开始迁移到Subversion。 所有外部SDK(> 500 MB)现在都保存在Source Safe中,我想方设法从VSS移动它们 到一些存储库。

我们有C ++(主要是),C#(很多),Java(很少)项目。数百个项目。只有Windows平台。

我有几个依赖管理员,但不满意:

  • NuGet - 适合.Net,但对C ++很痛苦
  • 常春藤 - 不深入,但似乎不适合C ++

第一个问题:我还能检查一下吗?它应该很容易被最终开发人员使用。最佳案例 - 在IDE中简单构建。


目前我倾向于下一个解决方案:

分配一些很少使用的驱动器,例如S:并将其声明为'DEV HOME'。

然后把外部放在这里:

S:\SDK\boost\1.30\...
S:\SDK\boost\1.45\...
S:\SDK\oracle\agile_9.0.0.0\...
S:\SDK\IBM\lotus_8.0\...
S:\SDK\IBM\lotus_9.0\...
S:\Tools\NuGet\nuget.exe
S:\Tools\clr\gacutil.exe

Autobuild机器将保存此“DEV HOME”的主屏幕。每个开发人员都应将必要的SDK从autobuild机器复制到本地,并使用 subst 创建磁盘。

我找不到这个解决方案的大问题:

  • 分支机构。不同分支中的项目可以包含对不同版本的SDK的引用(例如,提升)
  • 外部组件的版本不会太频繁地改变,所以这里不会有数百个,例如,升级版本。
  • 开发人员可以轻松设置。
  • 任何工具支持的绝对路径。
  • 如果您想使用不那么大的SSD驱动器来获取磁盘空间,则不会出现问题。 (目前我借助符号链接将我的外部设备移到单独的驱动器上。但对于其他开发人员来说,这看起来像黑魔法)

小问题:

  • 就个人而言,这不是一个美丽的解决方案。
  • 磁盘(S :)可能正忙
  • 无法在Linux中使用(但目前我们对它不感兴趣)

第二个问题:此解决方案可能存在哪些问题?


更新1 :为什么不是相对路径。

  1. 外部应该在源目录的一个目录中吗? :
  2. externals/...
    branch-root-1.0/project_collection_1/project1/...
    branch-root-2.0/project_collection_2/...
    

    这里所有项目应该在一个地方或重复的外部。似乎与绝对路径的解决方案没什么不同。

    1. 外部应该与源根目录​​在同一个文件夹中? :
    2. branch-root-1.0/externals/...
      branch-root-1.0/project_collection_1/project1/...
      branch-root-1.0/project_collection_2/...
      branch-root-2.0/externals/...
      

      然后在每个已检查的分支中重复外部。这为每个分支结账+ 500MB +设置它们的一些额外工作。

      嗯,这看起来可以接受,但我不知道它是绝对的路径。真的,我想知道相对路径的优点,因为我对绝对路径也是无法实现的。

2 个答案:

答案 0 :(得分:1)

我走了你的道路......它可以工作。但是我建议你制作所有相对路径并花时间让你的项目按相对路径排序。

任何固定目录系统和源代码控制的问题是您可以分支或多次检查项目。

此外,虽然颠覆是好的,但值得考虑Mercurial或Git。它们允许颠覆不具备的许多不同类型的工作流程。考虑如何构建存储库需要更多的工作,但这是值得的。这是源安全的大跳跃,根据我的经验,许多来自sourcesafe的人最初都在努力/不喜欢颠覆/ git / mercurial。它们都需要您更详细地了解版本控制,但这是一件好事,因为它是一个非常好的工具。

答案 1 :(得分:1)

我认为,如果你的平台只有Windows而Visual Studio那么NuGet是最好的。我喜欢Nuget几乎没有配置。例如,在将Boost Nuget package安装到项目后,可以立即使用Boost库。

  • 您无需配置包含/库路径(当前问题)。
  • 只要您复制(存储在SVN / mercurial中)packages.config文件,它就会自动在其他计算机上安装/配置/更新项目包。
  • 它可以解决/警告包之间的兼容性问题。

我不知道这个问题有什么好的跨平台解决方案。