conan.tools.files patches¶
conan.tools.files.patch()¶
- patch(conanfile, base_path=None, patch_file=None, patch_string=None, strip=0, fuzz=False, **kwargs)¶
在 conanfile.source_folder 目录中应用来自文件 (patch_file) 或字符串 (patch_string) 的差异。 源代码所在的文件夹可以使用 layout(self) 方法中的 self.folders 属性进行自定义。
- 参数:
conanfile – 当前配方,始终传递 ‘self’
base_path – 路径是相对于 conanfile.export_sources_folder 的相对路径,除非提供绝对路径。
patch_file – 应应用的补丁文件。 路径是相对于 conanfile.source_folder 的相对路径,除非提供绝对路径。
patch_string – 应应用的补丁字符串。
strip – 从路径中剥离的文件夹数量。
fuzz – 是否接受模糊补丁。
kwargs – 可以添加的额外参数,将有助于输出信息
用法
from conan.tools.files import patch
def build(self):
for it in self.conan_data.get("patches", {}).get(self.version, []):
patch(self, **it)
conan.tools.files.apply_conandata_patches()¶
- apply_conandata_patches(conanfile)¶
应用存储在
conanfile.conan_data(从conandata.yml文件读取) 中的补丁。 它将应用与给定conanfile.version匹配的patches条目下的所有补丁。 如果conandata.yml中未定义版本,它将直接应用patches关键字下的所有补丁。键条目将作为 kwargs 传递给
patch函数。
用法
from conan.tools.files import apply_conandata_patches
def source(self):
apply_conandata_patches(self)
示例 conandata.yml
patches:
- patch_file: "patches/0001-buildflatbuffers-cmake.patch"
- patch_file: "patches/0002-implicit-copy-constructor.patch"
base_path: "subfolder"
patch_type: backport
patch_source: https://github.com/google/flatbuffers/pull/5650
patch_description: Needed to build with modern clang compilers.
具有不同版本的不同补丁
patches:
"1.11.0":
- patch_file: "patches/0001-buildflatbuffers-cmake.patch"
- patch_file: "patches/0002-implicit-copy-constructor.patch"
base_path: "subfolder"
patch_type: backport
patch_source: https://github.com/google/flatbuffers/pull/5650
patch_description: Needed to build with modern clang compilers.
"1.12.0":
- patch_file: "patches/0001-buildflatbuffers-cmake.patch"
- patch_string: |
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -1232,6 +1292,8 @@ main (int argc, char **argv)
g_test_add_func ("/misc/pause-cancel", do_pause_cancel_test);
g_test_add_data_func ("/misc/stealing/async", GINT_TO_POINTER (FALSE), do_stealing_test);
g_test_add_data_func ("/misc/stealing/sync", GINT_TO_POINTER (TRUE), do_stealing_test);
+ g_test_add_func ("/misc/response/informational/content-length", do_response_informational_content_length_test);
+
ret = g_test_run ();
- patch_file: "patches/0003-fix-content-length-calculation.patch"
对于每个补丁,必须提供 patch_file、patch_string 或 patch_user 字段。 前两个由 apply_conandata_patches() 自动应用,而 patch_user 被忽略,必须由用户直接在 conanfile.py 配方中处理。
conan.tools.files.export_conandata_patches()¶
- export_conandata_patches(conanfile)¶
导出存储在 ‘conanfile.conan_data’ (从 ‘conandata.yml’ 文件读取) 中的补丁。 它将导出与给定 ‘conanfile.version’ 匹配的 ‘patches’ 条目下的所有补丁。 如果 ‘conandata.yml’ 中未定义版本,它将导出直接在 ‘patches’ 关键字下的所有补丁。
没有定义版本的 conandata.yml 示例
from conan.tools.files import export_conandata_patches
def export_sources(self):
export_conandata_patches(self)
core.sources.patch:extra_path¶
警告
此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。
该 export_conandata_patches() 工具可以在包创建时使用 core.sources.patch:extra_path 核心配置自动注入来自外部路径的补丁。
这意味着 conan create 命令在 conan-center-index 仓库中可以在不一定将补丁放在同一个仓库中,也不修改 conandata.yml 文件的情况下注入和应用补丁。
该 core.sources.patch:extra_path 配置应指向包含所有可能包的所有可能补丁的文件夹,结构与 conan-center-index 仓库中的结构相同
extra_folder
pkgname1
conandata.yml
patches
mypatch.path
pkgname2
...
该 conandata.yml 也应遵循相同的结构
patches:
"1.0":
- patch_file: "patches/mypatch.patch"
注意
在安装它们时(conan install --build=xxx),无法将补丁应用于任意依赖项,因为可能的注入补丁是包的“来源”身份的一部分,并且必须在配方修订版中表示。 缓存或远程服务器中已存在的包已经导出了其文件并计算了配方修订版,因此无法在不违反身份(以及作为结果的重现性和可追溯性)的情况下应用补丁。 因此,core.sources.patch:extra_path 只能在 conan create 时工作。