问题标签 [vendoring]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
218 浏览

go - 如何在我的 go 应用程序中更新 golang 标准库?

我有一个使用go1.16.4 构建的应用程序,它使用(导入)archive/zipGo std lib 的组件。我查看了golang 发行说明archive/zip,发现golang 1.16.5中已经修复了一个安全漏洞。如何确保我的应用程序不再易受攻击?我必须升级我自己的版本go,然后用那个新版本重建go?或者我可以提供更新版本的固定组件然后重建吗?$GOROOT必须更新构建机器中的文件吗?

0 投票
0 回答
56 浏览

cmake - 使用 CMake 构建供应商代码的最佳实践

我试图了解在使用现代 CMake (3.13+) 来构建和包含供应商或子模块代码时的一些最佳实践。

假设我正在构建一个库 MyLib。我的文件结构是这样的

在此示例中,我将 libgeos 作为 git 子模块包含在内,因为存在该依赖项,因此能够克隆项目并立即构建和运行测试非常方便。这也可以通过使用FetchContent或其他东西来解决,我的问题仍然存在;重要的是我不想依赖在构建环境中安装的 libgeos。

注意我随意选择了libgeos;我不知道是否将 libgeos 设置为适合此示例的 cmake 项目,但这都是理论上的,我只需要一些具体的库名称。请不要使用 libgeos 配置的具体细节来回答这个问题,除非 libgeos 是传统 cmake 的一个很好的例子。

但是现在,有一些其他项目想要使用我的项目,它需要 libgeos 并且不想依赖我的项目提供它。

当您克隆 OtherProject 时,您会得到两个版本的 libgeos,这可能不是很好;但这也不是一个大问题。也许它们不是同一个版本;假设 MyLib 需要 libgeos >= 2.0,因此 MyLib 包含 2.0,OtherProject 需要 libgeos>=2.1,因此 OtherProject 包含 libgeos >= 2.1。

现在我们可能会遇到一些构建问题。如果我们有以下行OtherProject/CMakeLists.txt

然后再一次,在同一行中MyLib/CMakeLists.txt,我们最终会出现 cmake 错误,因为libgeos在构建中定义了两次目标。这可以通过几种方式解决。

在添加之前检查 geos 是否存在

但是这个案例有一些问题;如果那个 blob 在OtherProject顶部,那很好,两个项目都使用 libgeos 2.1。但是如果它在OtherProject after add_subdirectory(submodules/MyLib)中,那么 geos 2.0 版本会被添加到构建中,这可能会或可能不会大声失败(希望它会失败)。

这也可以用find_package. 这两个项目都包括cmake/FindGeos.cmake使用上面的简介(if(NOT TARGET...))来添加geos构建,然后顶级项目cmake文件可以做到这一点

那么他们尝试包含地理信息的顺序并不重要,因为它们都会推迟FindGeos.cmakeOtherProject因为它是模块路径中的第一个。

但是现在出现了一个新问题,有些ThirdProject 也想用MyLib,但是ThirdProject 想依赖libgeos系统环境中的哪个。它用于find_package(geos 2.1 CONFIG)使用已安装的GeosConfig.cmake文件,该文件添加geos::geos到 build 和 sets 中geos_FOUND。突然,MyLib 无法构建,因为geos_FOUND已设置,但我正在做target_link_library(mylib PUBLIC geos).

因此,这可以通过添加add_library(geos::geos ALIAS geos)两个自定义FindGeos.cmake文件来解决,那么无论 geos 是从源代码构建还是使用已安装的版本,目标名称都是相同的。

现在我们来回答我的实际问题:让我们从

  1. 我是不是疯了,没有人这样做,而我的团队试图使用 cmake 都错了?
  2. 是否有一些我刚刚完全错过的 cmake 功能可以解决所有这些问题?
  3. 我怀疑有很多书或演示文稿涵盖了这个主题,但我只是不知道该去哪里找,因为太多了;我应该看什么?我看过CMake Packages页面,当您使用根据该页面配置的所有项目时,它看起来可以解决问题;但它并没有真正回答如何弥合新旧项目之间的差距。

如果我不是疯了,也没有我可以看的直截了当的答案或演示文稿,那么

  1. MyLib 和 libgeos 的 cmake 配置应该是什么样子才能使这些情况起作用?
  • MyLib 是单独构建的
  • MyLib 是作为一个更大项目的一部分构建的,该项目提供不同版本的 geos
  • MyLib 是作为更大项目的一部分构建的,该项目依赖于环境中不同版本的地理信息

MyLibConfig.cmake我知道如果我想在环境中安装它,cmake 提供了可用于生成的助手。我还看到该export()函数存在,可用于将这些文件保存在构建树中的某个位置,然后find_package在配置模式下找到它们。但这对我来说有点奇怪,因为它不是多阶段构建,它只是cmakethen的一次调用make

但是可以说这是正确的答案,而 CMake forlibgeos并没有遵循它。FindGeos.cmake做这样的事情是否合适?