【问题标题】:Using absolute paths for build dependencies使用绝对路径构建依赖项
【发布时间】:2013-03-31 09:12:05
【问题描述】:

目前我们使用 Source Safe 并开始迁移到 Subversion。 所有外部 SDK(> 500 MB)现在都保存在 Source Safe 中,我正在寻找将它们从 VSS 中移出的方法 到某个存储库。

我们有 C++(大部分)、C#(很多)、Java(少数)项目。数百个项目。仅限 Windows 平台。

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

  • NuGet - 对 .Net 很好,但对 C++ 很痛苦
  • Ivy - 不深入,但似乎不能被 C++ 接受

第一个问题:我还能检查什么?它应该易于最终开发人员使用。最佳案例 - 在 IDE 中进行简单构建。


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

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

然后在这里放置externals:

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 从自动构建机器复制到本地,并使用 subst 创建磁盘。

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

  • 分支机构。不同分支的项目可以包含对不同版本 SDK 的引用(例如 boost)
  • 外部组件的版本不会太频繁地变化,所以这里不会有数百个,比如提升版本。
  • 易于开发人员设置。
  • 任何工具都支持绝对路径。
  • 如果您想使用不太大的 SSD 驱动器作为源,则磁盘空间没有问题。 (目前我在符号链接的帮助下将我的外部组件移动到单独的驱动器。但对于其他开发人员来说,这看起来像是黑魔法)

小问题:

  • 就我个人而言,这不是一个漂亮的解决方案。
  • 磁盘 (S:) 可能正忙
  • 不能在 Linux 中按原样使用(但目前我们对此不感兴趣)

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


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

  1. externals 是否应该与源根目录​​在一个目录中? :

externals/...
branch-root-1.0/project_collection_1/project1/...
branch-root-2.0/project_collection_2/...

这里所有的项目都应该在一个地方或重复的外部。似乎与绝对路径的解决方案没有太大区别。

  1. Externals 应该与源根目录​​在同一个文件夹中? :

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 + 一些额外的设置工作。

嗯,这看起来可以接受,但我看不出它比绝对路径更好。真的,我想知道相对路径的优点,因为我也对绝对路径感到不舒服。

【问题讨论】:

  • programmers.stackexchange.com 会是这个问题更好的地方......

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


【解决方案1】:

我已经走上了你所拥有的道路......它可以工作。不过,我建议您将所有内容都设置为相对路径,并花时间根据相对路径对项目进行排序。

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

此外,虽然 subversion 很好,但值得考虑 Mercurial 或 Git。它们允许 subversion 不允许的许多不同类型的工作流程。考虑如何构建存储库需要更多的工作,但这是非常值得的。与 sourcesafe 相比,这是一个巨大的飞跃,根据我的经验,许多来自 sourcesafe 的人一开始真的很挣扎/不喜欢 subversion / git / mercurial。它们都要求您更详细地了解版本控制,但这是一件好事,因为它是一个非常好的工具。

【讨论】:

  • 关于相对路径参见更新 1。关于 git/hg:它缺少对特定人员的读取拒绝。管理层想要这个功能。是的,大型 VSS 存储库可以拆分为几个较小的存储库……但目前非常困难。项目相互依赖,VSS 数据库有许多(数千个)共享文件。所以,我选择SVN。可能是在迁移到 SVN 之后,我们可以考虑 Git。
  • 关于乘以结帐和分支。 S:\SDK 将包含每个分支上使用的 all 版本的 SDK。假设分支 1.0 中的项目可以引用 boost_1_35,但在主干中则可以引用 boost_1_45(换句话说,项目附加包含目录不应包含 /boost/,而是 /boost_1_35/)。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多