钩子¶
Conan 钩子是一项功能,旨在扩展 Conan 的功能,以便在包创建过程的不同阶段(如 pre-build 和 post-build)执行某些正交操作,例如一些质量检查。
钩子结构¶
钩子是一个 Python 函数,将在 Conan 工作流的特定点执行,以在不修改客户端源或配方源的情况下自定义客户端行为。
这是一个简单钩子的示例
from conan.tools.files import load
def pre_export(conanfile):
for field in ["url", "license", "description"]:
field_value = getattr(conanfile, field, None)
if not field_value:
conanfile.output.error(f"[REQUIRED ATTRIBUTES] Conanfile doesn't have '{field}'.
It is recommended to add it as attribute.")
此钩子在配方导出之前检查其内容。基本上,pre_export()
函数检查 conanfile
对象的属性,查看是否存在 URL、许可证和描述,如果缺失,则通过 conanfile.output
向用户发出警告消息。这在配方导出到本地缓存之前完成。
可以执行任何类型的 Python 脚本。您可以创建全局函数并从不同的钩子函数中调用它们,从相对模块导入,以及发出警告、错误甚至引发异常来中止 Conan 客户端的执行。
从模块导入¶
钩子接口应始终放在一个 Python 文件中,文件名为 hook_ 开头,扩展名为 .py。它还应存储在 <conan_home>/extensions/hooks 文件夹中。但是,如果您的系统中安装了导入的模块,或者它们是随 Conan 一起安装的,您可以使用这些模块的功能。
import requests
from conan.tools.files import replace_in_file
def post_package(conanfile):
if not os.path.isdir(os.path.join(conanfile.package_folder, "licenses")):
response = requests.get('https://api.github.com/repos/company/repository/contents/LICENSE')
您还可以从相对模块导入功能
hooks
├── custom_module
│ ├── custom.py
│ └── __init__.py
└── hook_printer.py
在我的 custom_module 中的 custom.py 文件内有
def my_printer(conanfile):
conanfile.output.info("my_printer(): CUSTOM MODULE")
它可以在钩子中导入模块使用,就像普通的 Python 一样
from custom_module.custom import my_printer
def pre_export(conanfile):
my_printer(conanfile)
钩子接口¶
这里您可以看到所有可用钩子函数的完整示例
def pre_export(conanfile):
conanfile.output.info("Running before to execute export() method.")
def post_export(conanfile):
conanfile.output.info("Running after of executing export() method.")
def pre_validate(conanfile):
conanfile.output.info("Running before executing the validate() method.")
def post_validate(conanfile):
conanfile.output.info("Running after executing the validate() method.")
def pre_source(conanfile):
conanfile.output.info("Running before to execute source() method.")
def post_source(conanfile):
conanfile.output.info("Running after of executing source() method.")
def pre_generate(conanfile):
conanfile.output.info("Running before to execute generate() method.")
def post_generate(conanfile):
conanfile.output.info("Running after of executing generate() method.")
def pre_build(conanfile):
conanfile.output.info("Running before to execute build() method.")
def post_build(conanfile):
conanfile.output.info("Running after of executing build() method.")
def post_build_fail(conanfile):
conanfile.output.info("Running after failed execution of build() method.")
def pre_package(conanfile):
conanfile.output.info("Running before to execute package() method.")
def post_package(conanfile):
conanfile.output.info("Running after of executing package() method.")
def pre_package_info(conanfile):
conanfile.output.info("Running before to execute package_info() method.")
def post_package_info(conanfile):
conanfile.output.info("Running after of executing package_info() method.")
钩子的函数意在对它们的执行进行自我描述。例如,pre_package()
函数在执行配方的 package()
方法之前被调用。
所有钩子方法都只填充同一个单一对象
conanfile:这是一个常规的
ConanFile
对象,从接收到 Conan 命令的配方中加载。它具有其常规属性和动态对象,例如build_folder
、package_folder
、output
、dependencies
、options
…
存储、激活与共享¶
钩子是存储在 <conan_home>/extensions/hooks 文件夹下的 Python 文件,并且其文件名应以 hook_ 开头,以 .py 扩展名结尾。
一旦钩子文件存储在钩子文件夹中,钩子就会自动激活。如果存储在子文件夹中,它也会自动工作。
要停用钩子,应将其文件从钩子文件夹中移除。没有可以停用但仍将文件存储在钩子文件夹中的配置。
官方钩子¶
在 Conan hooks GitHub 中有一些官方维护的钩子,但大部分只与 Conan 1.x 兼容,因此请先查看 README 以了解哪些钩子与 Conan v2 兼容。