Conan 1.8:插件系统、SVN 源代码管理支持、配方约定等诸多新特性!
经过漫长而期待的等待,Conan 1.8 版本终于发布了。它包含了许多新特性和修复,以及社区的一些优秀贡献。让我们一起看看此版本中的一些亮点。
插件系统
许多用户都希望能够自定义 Conan 的行为,以满足他们的需求,例如在安装新包、上传到服务器等操作之后执行一些任务。我们认为实现此目标的最佳方法是在 Conan 客户端中添加插件功能,因此我们实现了这一功能。
插件是包含一些**前置**和**后置**函数的 Python 文件,这些函数通过参数接收信息,并在 Conan 执行操作的前后执行。这些操作通常由其名称进行自我描述。
以下是一个简单的插件示例:
example_plugin.py
def pre_export(output, conanfile, conanfile_path, reference, **kwargs):
# Check basic meta-data
for field in ["url", "license", "description"]:
field_value = getattr(conanfile, field, None)
if not field_value:
output.warn("Conanfile doesn't have '%s'. "
"It is recommended to add it as an attribute"
% field)
插件可以包含多个函数,并在每个函数中执行不同的操作。它们还可以包含私有函数或从通过 pip 安装的模块或相关模块导入的函数。
插件存储在~/.conan/plugins目录下,可以使用conan config set
和conan config rm
根据需要激活。
关于插件,仍然有一些内容需要定义,例如它们的安装方式、如何管理或链接到配方、将来添加新功能,甚至更改当前函数签名等。因此,此功能也作为实验性功能发布,需要社区进行更多测试。欢迎您在 Conan 的问题追踪器中报告任何问题或改进,并在标题中使用[PLUGINS]
。
我们还创建了一个新的仓库conan-io/plugins,用于开发官方插件并在其自己的问题追踪器中管理新的插件建议。
SVN 源代码管理支持
正如之前版本中提到的,源代码管理功能一直在改进,并且我们终于实现了对SVN 的支持。
社区对此功能进行了大量的互动,超过 80 条评论和审查用于开发此新功能。
您可以看到它可以像使用 Git 一样透明地使用:
from conans import ConanFile, tools
class ConanLib(ConanFile):
name = "lib"
version = "0.1"
scm = {
"type": "svn",
"url": "auto",
"revision": "auto",
"subfolder": "onesubfolder"
}
还有一个新的SVN 工具包装器,可以在配方中用于任何目的。
请记住,此功能仍处于实验阶段,因为最终可能会添加其他源代码管理类型,这可能会更改接口。但是,我们鼓励 SVN 用户尝试此功能并报告新问题或建议改进,并在问题标题中使用[SVN]
。
配方的新约定
受保护的 ConanFile 成员
我们看到了创建的配方的巨大发展,并且随着新功能的开发,我们认为需要为ConanFile
属性和方法制定命名约定,以避免任何未来的冲突。
从现在开始,我们鼓励用户在想要使用自定义属性时在配方中使用受保护的成员:
class MyConanFile(ConanFile):
name = "myconan"
version = "1.0.0"
_custom_attribute = "some_value" # user protected attribute
def _custom_method(self):
self.output.info(_custom_attribute)
在参考部分中包含了一条说明,以使用户了解此新约定。
引发ConanInvalidConfiguration
Conan 文档中有一些地方鼓励在configure()
中引发异常,用于库不支持的配置。
为此目的,我们引入了一个名为ConanInvalidConfiguration
的特殊异常,它对 Conan 客户端的返回代码有不同的处理方式。这样,此类型的异常就可以被像ConanPackageTools
(WIP)这样的工具解释为不同的错误。
以下是一个示例:
from conans import ConanFile
from conans.errors import ConanInvalidConfiguration
class MyConan(ConanFile):
name = "myconan"
version = "0.1.3"
settings = "os", "compiler", "arch", "build_type"
def configure(self):
if self.settings.os != "Windows":
raise ConanInvalidConfiguration("Library only supports Windows")
默认选项作为字典
默认选项及其推断类型的语法一直很棘手,因此我们做了一些工作来记录选项值比较的行为。
仍然有改进的空间,但在不破坏现有配方的情况下想出一个解决方案并不容易。因此,为了为将来的开发铺平道路,建议使用conanfile.py中的字典来声明默认选项。
class MyPkg(ConanFile):
...
requires = "OtherPkg/0.1@user/channel"
options = {"shared": [True, False],
"option1": ["value1", "value2"],
"option2": "ANY"}
default_options = {"shared": True,
"option1": "value1",
"option2": 42,
"OtherPkg:shared": True}
具有固定安装目录的构建辅助工具
根据一些使用 SUSE 和类似 Linux 发行版的用户报告的问题,我们意识到AutoToolsBuildEnvironment
构建辅助工具中的安装目录依赖于平台,主要使用lib64文件夹而不是lib文件夹。
这会破坏从源代码重建的配方,因为消费者在self.cpp_info.libdirs
中声明的默认库目录始终为lib。
构建辅助工具无法根据执行位置生成不同的目录结构,因此我们已将这些输出目录修复为 CMake(请参阅安装定义)和 AutoTools(请参阅configure())构建辅助工具最常见的默认目录。在AutoToolsBuildEnvironment
中还有一个标志use_default_install_dirs
用于跳过此行为。
您将在 AutoTools 参考部分找到有关此更改的警告,并提供对问题说明的清晰解释。
新生成器:B2
此版本为 B2(也称为 Boost Build)提供了一个新的生成器。此生成器具有完整的功能,例如使用子项目和目标。它增强了功能并弃用了boost-build
生成器。
您可以在文档参考中找到更多相关信息:https://docs.conan.org.cn/en/latest/reference/generators/b2.html
工具和输出
此版本还提供了一些新的工具和改进。
-
tools.replace_path_in_file()
:一个新的工具,用于将文件中的路径替换为另一个字符串。在 Windows 中,即使大小写和路径分隔符不匹配,它也会匹配路径。 -
tools.collect_libs()
现在会在self.cpp_info.libdirs
中搜索库。 -
tools.vcvars()
已得到增强,以避免出现环境变量大小限制问题,并且也可以与clang-cl
一起使用。
最后,输出方面也有一些变化。
-
现在,每次发出
conan install
命令时,都会在输出中打印配置文件。请注意,此配置类似于用于安装的配置文件,而不是严格应用于包的最终值。$ conan install . Configuration: [settings] os=Windows os_build=Windows arch=x86_64 arch_build=x86_64 compiler=Visual Studio compiler.version=15 build_type=Release [options] [build_requires] [env] PROJECT: Installing /home/user/repos/conan-box2d/conanfile.py ...
-
按照弃用 Python 2 的路线图,为 Python 2 用户提供了一个新的警告,建议迁移到 Python 3。
$ conan create . conan/stable Python 2 will soon be deprecated. It is strongly recommended to use Python 3 with Conan: https://docs.conan.org.cn/en/latest/installation.html#python-2-deprecation-notice Exporting package recipe box2d/2.3.1@conan/stable export: Copied 1 '.txt' file: CMakeLists.txt ...
如果您想了解有关此版本中更改的更多信息,请查看更改日志中功能和修复的完整列表(它包含指向相关 Pull Request 的链接),并不要忘记更新!