经过漫长而期待的等待,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 setconan 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 的链接),并不要忘记更新