如何强制柯南从源代码构建,但前提是它不在缓存中?
How to force conan to build from source, but only if it is not in the cache?
我在企业环境中使用 conan
,其中的操作系统相当陈旧并且有旧版本的 glibc
(2.11)。因此,conan.io
上的许多预构建二进制文件最终无法在我的环境中运行。然而,conan
并不知道这一点,并且会很乐意将它们下载并安装到我的系统上,从而导致 link-time 错误。
我发现,如果我从源代码构建,我可以让这些库正常工作。
我想要的行为如下:
- 第一次使用
conan install
安装库(例如,它在我的缓存中 不是 )然后 conan
将从源构建并将其放置在我的缓存中,然后使用它。
- 在
conan install
的后续调用中,conan
找到缓存库并使用它,而无需从源代码重建。
- 我正在调用
conan install
作为自动构建脚本的一部分,所以我不想根据这是否是第一次安装库来修改调用(但修改一个配置文件没问题)。
我在实践中遇到了这种行为。 以下是我 运行 面临的挑战:
- 如果我使用
conan install --build=thelibrary
,那么 conan
每次 都会从源重建那个库 我调用 conan install --build=thelibrary
,即使它已经存在于我的缓存中。
- 如果我使用
conan install --build=missing
,那么我可以通过设置一些没有关联预构建二进制文件的构建选项来欺骗 conan
构建库。
- 这很脆弱,因为它仅适用于具有足够构建选项的项目,因此难以为所有组合创建预构建选项。
- 如果我需要的所有构建选项都对应于预构建的二进制文件,它也不起作用。
这是我要找的东西(我假设存在但找不到):
- 我可以在我的
conanfile.txt
(或其他一些配置文件)中放置一些设置,告诉 conan
忽略给定库的预构建二进制文件,而是从源代码构建,但是如果可用,请使用缓存版本。
- 理想情况下,这应该可以工作,而无需修改构建选项。
- 我不一定要从源代码构建 所有 库,只是那些不会 运行 在我古老的 OS 上的库,但是如果我必须接受“全有或全无”,我会选择“全部”。
conan
可以吗?
glibc 版本是柯南的一个老头疼的问题,因为它不是设置的一部分,因此不计入包 ID 的一部分。 Conan Docker张图片是运行Ubuntu张,有些是旧的,有些是新的。但是有一个特定的 Docker 图像 运行 CentOS6,它是由于 glibc 2.12 而创建的,可以帮助生成软件包。
对于您的具体情况,我们有几个选择:
添加 glibc
作为设置的一部分,这样 Conan 就不会因为包 ID 而替换您的包。由于你应该有更多的同事,你可以使用conan config命令进行设置分发。
# ~/.conan/settings.yml
glibc: [None, 2.11, ...]
添加它,您也可以更新您的个人资料,使 glibc=2.11
成为默认设置。
另一种选择是 package revisions 功能,您可以在其中锁定特定的二进制包以供使用,这意味着您要使用该特定的包。您只需要使用 glibc 上传生成的包并使用其二进制包修订版,例如lib/1.0@conan/stable#RREV:PACKAGE_ID#PREV
另外,回答你的问题:
Some setting I can place in my conanfile.txt (or some other configuration file) that tells conan to ignore pre-built binaries for a given library or libraries and instead build from source, but use the cached version if it is available.
你的缓存是柯南第一选项,它会首先在那里寻找一个预构建的包,如果它不可用,它会按照排序顺序查看你的遥控器。您的请求是不可能的,首先,因为 conanfile.txt doesn't support build policies, second, because conanfile.py 只支持从源构建全部,或者仅构建缺失。
我的建议是,安装一个 Artifactory 实例,构建你需要的东西,上传你的自定义包,并将其作为你的默认远程。
I don't necessarily want to build all libraries from source, just the ones that won't run on my ancient OS, but if I have to settle for "all-or-nothing" I will take "all".
您可以将一些包引用与远程 运行 conan remote 命令相关联。假设您要下载使用 glibc-2.11
构建的 zlib/1.2.11
,并且它仅在您的组织远程可用:
$ conan remote add_ref zlib/1.2.11@org/stable my_org_repo
$ conan remote list_ref # only to validate, not mandatory
zlib/1.2.11@org/stable: my_org_repo
现在您的特定包已关联到您的组织。 Conan 仍然会首先在您的本地缓存中查找该包,但是当找不到时,它会尝试在您的 Artifactory 中查找。
如您所见,使用新设置可以更轻松地解决您的案例,而不是试图破解构建策略。作为另一种选择,您可以将 glib
设置替换为 distro
及其版本。
我在企业环境中使用 conan
,其中的操作系统相当陈旧并且有旧版本的 glibc
(2.11)。因此,conan.io
上的许多预构建二进制文件最终无法在我的环境中运行。然而,conan
并不知道这一点,并且会很乐意将它们下载并安装到我的系统上,从而导致 link-time 错误。
我发现,如果我从源代码构建,我可以让这些库正常工作。
我想要的行为如下:
- 第一次使用
conan install
安装库(例如,它在我的缓存中 不是 )然后conan
将从源构建并将其放置在我的缓存中,然后使用它。 - 在
conan install
的后续调用中,conan
找到缓存库并使用它,而无需从源代码重建。 - 我正在调用
conan install
作为自动构建脚本的一部分,所以我不想根据这是否是第一次安装库来修改调用(但修改一个配置文件没问题)。
我在实践中遇到了这种行为。 以下是我 运行 面临的挑战:
- 如果我使用
conan install --build=thelibrary
,那么conan
每次 都会从源重建那个库 我调用conan install --build=thelibrary
,即使它已经存在于我的缓存中。 - 如果我使用
conan install --build=missing
,那么我可以通过设置一些没有关联预构建二进制文件的构建选项来欺骗conan
构建库。- 这很脆弱,因为它仅适用于具有足够构建选项的项目,因此难以为所有组合创建预构建选项。
- 如果我需要的所有构建选项都对应于预构建的二进制文件,它也不起作用。
这是我要找的东西(我假设存在但找不到):
- 我可以在我的
conanfile.txt
(或其他一些配置文件)中放置一些设置,告诉conan
忽略给定库的预构建二进制文件,而是从源代码构建,但是如果可用,请使用缓存版本。- 理想情况下,这应该可以工作,而无需修改构建选项。
- 我不一定要从源代码构建 所有 库,只是那些不会 运行 在我古老的 OS 上的库,但是如果我必须接受“全有或全无”,我会选择“全部”。
conan
可以吗?
glibc 版本是柯南的一个老头疼的问题,因为它不是设置的一部分,因此不计入包 ID 的一部分。 Conan Docker张图片是运行Ubuntu张,有些是旧的,有些是新的。但是有一个特定的 Docker 图像 运行 CentOS6,它是由于 glibc 2.12 而创建的,可以帮助生成软件包。
对于您的具体情况,我们有几个选择:
添加
glibc
作为设置的一部分,这样 Conan 就不会因为包 ID 而替换您的包。由于你应该有更多的同事,你可以使用conan config命令进行设置分发。# ~/.conan/settings.yml glibc: [None, 2.11, ...]
添加它,您也可以更新您的个人资料,使
glibc=2.11
成为默认设置。另一种选择是 package revisions 功能,您可以在其中锁定特定的二进制包以供使用,这意味着您要使用该特定的包。您只需要使用 glibc 上传生成的包并使用其二进制包修订版,例如
lib/1.0@conan/stable#RREV:PACKAGE_ID#PREV
另外,回答你的问题:
Some setting I can place in my conanfile.txt (or some other configuration file) that tells conan to ignore pre-built binaries for a given library or libraries and instead build from source, but use the cached version if it is available.
你的缓存是柯南第一选项,它会首先在那里寻找一个预构建的包,如果它不可用,它会按照排序顺序查看你的遥控器。您的请求是不可能的,首先,因为 conanfile.txt doesn't support build policies, second, because conanfile.py 只支持从源构建全部,或者仅构建缺失。
我的建议是,安装一个 Artifactory 实例,构建你需要的东西,上传你的自定义包,并将其作为你的默认远程。
I don't necessarily want to build all libraries from source, just the ones that won't run on my ancient OS, but if I have to settle for "all-or-nothing" I will take "all".
您可以将一些包引用与远程 运行 conan remote 命令相关联。假设您要下载使用 glibc-2.11
构建的 zlib/1.2.11
,并且它仅在您的组织远程可用:
$ conan remote add_ref zlib/1.2.11@org/stable my_org_repo
$ conan remote list_ref # only to validate, not mandatory
zlib/1.2.11@org/stable: my_org_repo
现在您的特定包已关联到您的组织。 Conan 仍然会首先在您的本地缓存中查找该包,但是当找不到时,它会尝试在您的 Artifactory 中查找。
如您所见,使用新设置可以更轻松地解决您的案例,而不是试图破解构建策略。作为另一种选择,您可以将 glib
设置替换为 distro
及其版本。