问题描述
我正在尝试掌握柯南的工作原理,并学习柯南的文档。
到目前为止,我从客户端得到的是,客户端编写了一个 conanfile.txt
文件,其中包含一个 [requirements]
部分,其中指定了项目的所有要求。
当客户端运行 conan install
- Conan 从 ~/.conan/profiles/default
读取客户端的设置(或者也可以通过 Conan CLI 指定另一个配置文件)并从远程下载相关的二进制包(假设它不存在于本地缓存中)对应于配置文件(如操作系统、架构等)。
我的困惑始于生产者方面。这是我目前得到的:为了创建一个包,您需要编写一个 conanfile.py
,它被称为 recipe。这个秘籍描述了二进制包的构建。
docs 表示 conan create
相当于:
$ conan export . demo/testing
$ conan install hello/0.1@demo/testing --build=hello
# package is created Now,use test to test it
$ conan test test_package hello/0.1@demo/testing
有些地方我不明白:
- 客户端为什么要下载配方?配方不是仅用于创建包吗?
- 为什么客户的个人资料包含
compiler
位?例如,我可以理解os
和arch
,因为 X86-Windows 客户端机器无法处理 Linux 包或 ARM 包,但是为什么编译器是指定的配置的一部分客户? - 配方包含一行
settings = "os","compiler","build_type","arch"
文档说:
设置字段定义了不同二进制包的配置。在此示例中,我们定义了对操作系统、编译器、架构或构建类型的任何更改都将生成不同的二进制包。请注意,Conan 会为同一配方的不同引入配置(在本例中为设置)生成不同的二进制包。
在包创建过程中究竟要构建哪些配置?
-
conan install
既用于包创建又用于包消费?
解决方法
这里有一些答案:
- 客户端为什么要下载配方?配方不是仅用于创建包吗?
是的,客户端会下载配方,因为如果所需的包 ID 没有二进制文件,则该配方将用于构建源代码。并非所有配置都在 conan-center
中可用。
此外,conan install
命令中的 build options 会影响其行为。下载配方比只下载包更方便。
这种行为不会改变,因为它是柯南 1.0 的一部分,会破坏许多使用柯南缓存中的食谱的用户。
- 为什么客户端的配置文件包含编译器位?例如,我可以理解 os 和 arch,因为 X86-Windows 客户端机器无法处理 Linux 包或 ARM 包,但为什么编译器是客户端指定的配置的一部分?
不同的编译器提供不同的二进制文件。在 Windows 上,您可以使用来自 mingw 或 MSVC 的 gcc。在 Linux 上,您可以使用 clang 或 gcc,它们在大多数情况下是兼容的,但会生成不同的二进制文件,包括优化级别。此外,还有与每个编译器相关的其他重要标志,例如 libcxx(libstdc++、libc++、libstdc++11)或 MSVC 运行时(MT、MD)。部分编译器版本仅支持 C++11(GCC 4.9),因此在构建项目时必须确保编译器兼容性。基本上,它会影响 ABI compatibility。
在包创建过程中具体在哪里指定要构建哪些配置?
包生成已记录,请阅读:
- conan install 既用于包创建又用于包消费?
如果您想开发一个新的简单配方,请在您的机器上构建并使用它,因此 conan create
是一种方法。创建新配方时,您将在 90% 的情况下使用 conan create。您可以阅读 Development flow with Conan Create 部分了解更多信息。
另一方面,conan install 主要用于包消费,但它也可以用于包创建。什么时候?
- Development flow
- 当您想要安装软件包,但又想从源代码构建它时。
背后的原因是因为 conan install
先出现,它用于两个提议,但我们需要更直接的东西来创建包,所以引入了 conan create
。但是,由于我们无法删除功能,由于向后兼容规则,conan install
仍然可以用作包创建者。