从所有依赖项复制源代码¶
请首先克隆源代码以重新创建此项目。您可以在 GitHub 的 examples2 仓库中找到它们。
$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/examples/extensions/deployers/sources
在本示例中,我们将了解如何创建和使用自定义部署器。此部署器将从您的所有依赖项复制所有源代码,并将其放入特定的输出文件夹
注意
为了更好地理解此示例,强烈建议您先阅读 部署器 参考。
定位部署器¶
在这种情况下,部署器位于与我们的示例 conanfile 相同的目录中,但如 部署器 参考所示,Conan 将按以下顺序在几个额外的位置查找指定的部署器,即
绝对路径
相对于当前工作目录
在
[CONAN_HOME]/extensions/deployers文件夹中内置部署器
运行它¶
对于我们的示例,我们有一个简单的配方,其中列出了 zlib 和 mcap 作为依赖项。借助 tools.build:download_source=True 配置,我们可以强制调用其 source() 方法,这将确保即使不需要进行构建,源代码也可用。
现在,您应该能够在 conan install 和 conan graph 命令中,针对任何给定的配方使用新的部署器
$ conan graph info . -c tools.build:download_source=True --deployer=sources_deploy
检查命令输出,我们可以看到它复制了我们的直接依赖项 zlib 和 mcap 的源代码,**以及**我们的传递依赖项 zstd 和 lz4 的源代码,到 dependencies_sources 文件夹。完成此操作后,可以对额外的内容进行预处理,以完成更具体的需求。
请注意,您可以传递 --deployer-folder 参数来更改部署器的基本输出文件夹路径。
代码导览¶
source_deploy.py 文件包含以下代码
from conan.errors import ConanException
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()¶
Conan 调用 deploy() 方法,并将其作为参数传递给依赖关系图和输出文件夹路径。它遍历我们配方的所有依赖项,并使用 conan.tools.copy 将每个源代码文件复制到 dependencies_sources 下的各自文件夹中。
注意
如果您将此部署器作为您自己的示例,请记住 tools.build:download_source=True 是必要的,以便为依赖项定义 dep.folders.source_folder。如果没有该配置,对于不需要从源代码构建的那些依赖项,或者对于不需要构建的那些命令(例如 conan graph),则不会定义该变量。
注意
如果您的自定义部署器需要访问完整的依赖关系图,包括那些可能被跳过的库,请使用 tools.graph:skip_binaries=False 配置。这对于收集例如图形中的所有许可证非常有用。