4

我知道有些帖子询问如何将第三方库存储到源代码控制中(例如thisthis)。虽然这些都是很好的答案,但我仍然找不到答案:

您如何存储需要更改编译器/IDE 以使库正常工作的第三方中间件/框架二进制文件?注意:根据我的需要,我不需要存储中间件源,我只存储头文件/lib/JAR ..以便它可以链接。

通常,您只需将库链接到您的应用程序,就可以了。但是需要更多的中间件/框架呢?

具体例子:

  • Qt moc 预处理器。

  • ZeroC Ice Slice (ice) 编译器(类似于 CORBA IDL 预处理器)。

基本上,这些框架/中间件需要在您的应用程序链接到它之前生成它们自己的代码。

从开发人员的角度来看,理想情况下他只想结帐,一切都应该准备就绪。但是我的IDE/编译器还没有正确设置,所以编译会失败..

你怎么看?

4

6 回答 6

4

备份所有内容,包括 IDE 的设置、操作系统等。这就是我所做的

1) 将所有 3rd 方库存储在源代码管理中。我有一个所有图书馆的分支。

2)备份用于构建的整个工具链。这包括所有工具。每个工具都安装在每台开发人员计算机上的同一目录中,因此远程设置开发人员计算机变得简单。

3)这是最硬核的,但是准备1个完美的干净的开发人员IDE设置,然后用它制作一个VMWare / VirtualPC映像。当您将来似乎无法让安装程序工作时,这将很有用。

我以痛苦的方式吸取了这一课,因为我经常不得不浏览无法正确构建的 Visual Studio 6 代码。

于 2009-10-14T02:03:21.213 回答
2

我认为更好的解决方案是确保构建是独立的,并为自己下载所有必要的软件,除非您另有说明。这是 maven 的工作方式,非常方便。缺点是有时需要下载应用服务器或类似的东西,这是非常不切实际的,但至少构建成功,并且如果需要改进构建成为新开发人员的责任。

如果您的软件需要有人参与安装,这当然效果不佳,但无论如何我都会尽量避免任何此类依赖关系。您可以添加替代路线(例如,如果 Eclipse 尚未完成,则 ant 脚本会编译代码)。如果这不可行,另一种选择是失败并明确指出发生了什么问题(例如,'CORBA_COMPILER_HOME' 未设置,请设置并重试')。

综上所述,最完整的解决方案当然是随您的应用程序一起提供所有内容(即操作系统、IDE、作品),但我怀疑这是否适用于一般情况,您对构建这种类型的需求有何看法软件产品?它还限制了希望将您的软件适应新平台的人。

于 2009-10-23T12:28:20.343 回答
1

增加1步怎么样。

一个以 bat 文件启动的 nant 脚本。开发人员只需执行一个 .bat 文件,bat 文件可以启动 nant,并且可以使 Nant 脚本执行您需要的任何操作。

于 2009-10-20T17:02:25.550 回答
1

这实际上是一个非常微妙的问题。您正在谈论如何管理环境的功能,这些功能是允许您继续构建所必需的。在这种情况下,它是代码工具链的顶层,但问题可以概括为包括整个工具链,甚至操作系统的关键方面。

在我工作的地方,在我们的代码成功运行之前,我们对底层操作系统有各种要求。这包括特定于机器的配置以及确保存在正确版本的系统库和语言运行时。我们通过维护包含我们需要的工具链要求的标准通用构建机器映像来处理这个问题。我们可以将其推送到一台原始机器上,并获得一个包含完整工具链和任何辅助程序的基本环境。

然后,我们使用fsvs对任何附加配置进行版本控制,这些配置可以根据需要分层到特定的机器组。

最后,我们使用连接到 CI 服务器(我们使用Hudson)的自定义脚本来执行特定项目所需的任何预处理步骤。

这种方法对我们的主要优点是:

  1. 我们可以非常轻松地构建和部署开发人员和生产机器(并让 IT 处理这方面的问题)。
  2. 我们可以轻松更换故障机器。
  3. 我们有一个已知的测试环境(我们在上线之前将所有内容安装到模拟的“生产服务器”)。
  4. 我们(软件团队)版本控制关键配置细节和任何明确的预处理步骤。
于 2009-10-20T21:28:19.397 回答
1

更新:这并没有真正回答如何修改 IDE。它只是 C++/Python/Java 的一种 Maven 替代品。您不需要修改 IDE 来构建东西,如果是这样,您需要一个不同的 IDE 或一个为您生成/修改 IDE 文件的系统。(有关跨平台 c/c++ 项目文件生成器,请参阅CMake 。)


我编写了一个系统(首先在两个不同地方的 Ant/Beanshell 中,然后在我目前的工作中用 Python 重写它),其中第三方单独编译(由某人),通过 HTTP 存储和共享。

有点匆忙的描述如下

启动时,构建系统会查看 repo 中的所有模块,执行每个模块的设置目标,该目标会下载当前代码修订版使用的第三方库或应用程序的特定版本。然后将它们解压缩,将 PATH/INCLUDE 等添加到(或者,对于小型库,将它们复制到当前存储库的单个目录中),然后使用 /useenv 启动 Visual Studio。

每个模块的文件检查它需要的东西,如果它需要安装和许可,例如 Visual Studio、Matlab 或 Maya,则必须在本地计算机上。如果那不存在,则 cmd 文件将失败并显示一个很好的错误消息。这样,您还可以检查是否存在正确的版本

因此,涉及的本地磁盘上有许多目录。%work% 需要使用全局环境变量进行设置,最好在不同于系统或源代码检查的磁盘上设置,至少在执行繁重的 C++ 时是这样。

  • %work% <- 所有临时文件、解压缩文件和每个工作副本的临时文件的本地存储
  • %work%/_cache <- 下载的 zips (2 gb)
  • %work%/_local <- 本地拉链(用于开发或在旅行时以其他方式检索)
  • %work%/_unzip <- 解压缩 _cache (10 gb) 中的文件
  • %work%&_content <- 纹理/3d 模型和其他大文件(手动同步,今天是 5 GB,也不适合 VC)
  • %work%/D_trunk/ <- 存储签出到 d:/trunk 的工作副本
  • %work%/E_branches/v2 <- 存储检出到 e:/branches/v2 的工作副本

因此,如果主干使用 Boost 1.37 并且分支/v2 使用 1.39,则 boost-1.39 和 boost-1.37 都驻留在 /_cache/(作为 zip)和 /_unzip/(作为原始文件)中。

使用 d:/trunk/BuildSystem/Visual Studio.cmd 中的 bat 文件启动 Visual Studio 时,INCLUDE 指向 /_unzip/boost-1.37,而如果运行 e:/branches/v2/BuildSystem/Visual Studio.cmd,INCLUDE 指向/_unzip/boost-1.39。

在 repo 中,只需要存储一小部分 bootstrap 二进制文件(即 wget 和 7z)。

我们目前下载了大约 2 gb 的打包数据,这些数据被解压缩到 10 gb(pdb 文件很大!),因此将其置于源代码控制之外是必不可少的。有了这个系统,我们可以保持足够小的 repo 大小以使用 DVCS,例如 Mercurial(或 Git)而不是 SVN,这非常好。(我正在考虑使用 Mercurials bigfiles 扩展或文件共享,而不是单独的 http 服务目录。)

它完美无缺。开发人员只需检查,为其本地缓存设置环境变量,然后通过存储库中的特定批处理文件运行 Visual Studio。没有解压缩或编译或东西。新开发人员可以立即设置他的计算机。(安装 Visual Studio 需要更多时间。)

第一次使用新计算机需要一些时间,但很快,只需几秒钟。下载/解压缩在本地计算机上共享,检查其他分支/版本不会占用更多空间。也可以离线工作,如果上传了新文件,您只需要手动获取 zip 文件。(此机制对于测试第三方库的新版本/编译至关重要。)

基础知识在 bitbucket 上的一个repo 中,但是在它为公众准备好之前还需要做更多的工作。除了文档和波兰语,我还计划:

  • 将其扩展为使用 cmake 而不是原始 vcproj 文件,以使其更具跨平台性。
  • 编写从第三方包的签出/下载到构建和压缩它们的整个过程(包括将下载存储在本地存储库中)......目前在我的开发计算机上。不好。会修复。:)

至于 moc,我们使用Qt 的 Visual Studio 插件,它将其存储在 .vcproj 文件中。效果很好。我确实认为CMake是最好的答案之一

于 2009-10-24T10:30:58.587 回答
1

我会将构建中间件的任务外包给专门的构建服务器,并且仅将二进制输出作为源代码控制下的常规 3rd 方依赖项包括在内。

这种策略能否成功应用,取决于是否所有的开发者都需要能够经常更改中间件代码并重新编译。但是这个问题也可以通过像 Teamcity 这样允许创建私有构建的持续集成服务器来解决。

您的构建过程如下所示:

  • 包含中间件代码的中间件仓库
  • 搭建服务器,搭建中间件
  • 将中间件构建输出作为 3rd 方引用推送到项目存储库
于 2009-10-24T17:37:54.857 回答