命令包装器

cmd_wrapper.py 扩展插件是一个 Python 脚本,它接收由 self.run() 配方调用提供的命令行参数,并允许拦截这些参数并返回一个新的参数。

此插件必须位于 extensions/plugins 缓存文件夹中,并且可以使用 conan config install 命令进行安装。

例如

def cmd_wrapper(cmd, **kwargs):
    return 'echo "{}"'.format(cmd)

这将只拦截命令并将其显示到终端,这意味着所有配方中的所有命令,即 self.run() 将不会执行,而只会回显。

**kwargs 是一个强制性的通用参数,旨在使其能够抵御未来的更改以及 Conan 注入新关键字参数。不添加它,即使不使用,也可能导致扩展在未来的 Conan 版本中失效。

一个更常见的用例是在某些命令上注入并行化工具,其形式可能如下所示

def cmd_wrapper(cmd, **kwargs):
    # lets parallelize only CMake invocations
    if cmd.startswith("cmake"):
        return 'parallel-build "{}"  --parallel-argument'.format(cmd)
    # otherwise return same command, not modified
    return cmd

conanfile 对象作为参数传递,因此可以根据调用者自定义行为

def cmd_wrapper(cmd, conanfile, **kwargs):
    # Let's parallelize only CMake invocations, for a few specific heavy packages
    name = conanfile.ref.name
    heavy_pkgs = ["qt", "boost", "abseil", "opencv", "ffmpeg"]
    if cmd.startswith("cmake") and name in heavy_pkgs:
        return 'parallel-build "{}"  --parallel-argument'.format(cmd)
    # otherwise return same command, not modified
    return cmd