复制所有依赖项的源文件¶
请先克隆源文件以重现此项目。你可以在 GitHub 的 examples2 仓库中找到它们。
$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/examples/extensions/deployers/sources
在这个例子中,我们将看到如何创建和使用自定义 deployer。这个 deployer 会从你的依赖项中复制所有源文件,并将它们放到指定的输出文件夹中。
注意
为了更好地理解这个例子,强烈建议先阅读 Deployers 参考文档。
定位 deployer¶
在这个例子中,deployer 位于我们示例 conanfile 的同一目录下,但如 Deployers 参考文档中所示,Conan 会按顺序在几个额外的位置查找指定的 deployer,包括:
绝对路径
相对于当前工作目录 (cwd)
在
[CONAN_HOME]/extensions/deployers
文件夹中内置 deployer
运行它¶
在我们的例子中,我们有一个简单的 recipe,将 zlib
和 mcap
都列为依赖项。借助 tools.build:download_source=True
配置项,我们可以强制调用其 source()
方法,这将确保即使不需要构建,源文件也可用。
现在,你可以在任何给定的 recipe 中使用新的 deployer,无论是 conan install
命令还是 conan graph
命令。
$ conan graph info . -c tools.build:download_source=True --deployer=sources_deploy
检查命令输出,我们可以看到它不仅复制了我们的直接依赖项 zlib
和 mcap
的源文件,**还**复制了我们的传递性依赖项 zstd
和 lz4
的源文件到 dependencies_sources
文件夹中。完成此操作后,可以进行额外的预处理以满足更特定的需求。
请注意,你可以传递 --deployer-folder
参数来更改 deployer 的基础输出文件夹路径。
代码导览¶
source_deploy.py 文件包含以下代码
from conan.tools.files import copy
import os
def deploy(graph, output_folder, **kwargs):
# Note the kwargs argument is mandatory to be robust against future changes.
for name, dep in graph.root.conanfile.dependencies.items():
if dep.folders is None or dep.folders.source_folder is None:
raise ConanException(f"Sources missing for {name} dependency.\n"
"This deployer needs the sources of every dependency present to work, either building from source, "
"or by using the 'tools.build:download_source' conf.")
copy(graph.root.conanfile, "*", dep.folders.source_folder, os.path.join(output_folder, "dependency_sources", str(dep)))
deploy()¶
deploy()
方法由 Conan 调用,并接收依赖图和输出文件夹路径作为参数。它遍历我们 recipe 的所有依赖项,并使用 conan.tools.copy 将每个源文件复制到 dependencies_sources
下各自的文件夹中。
注意
如果你将此 deployer 用作自己的示例,请记住需要 tools.build:download_source=True
配置项,以便为依赖项定义 dep.folders.source_folder
。如果没有此配置项,对于那些不需要从源代码构建的依赖项以及不需要构建的命令(例如 conan graph),该变量将不会被定义。
注意
如果你的自定义 deployer 需要访问完整的依赖图(包括那些可能被跳过的库),请使用 tools.graph:skip_binaries=False
配置项。这对于收集图中的所有许可证等非常有用。