conan.tools.files 基本操作¶
conan.tools.files.copy()¶
- copy(conanfile, pattern, src, dst, keep_path=True, excludes=None, ignore_case=True, overwrite_equal=False)¶
将与 src 文件夹中模式 (fnmatch) 匹配的文件复制到 dst 文件夹。
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。pattern – (必需) 应该复制的文件所匹配的 fnmatch 文件模式。它不能以
..
相对路径开头,否则将抛出异常。src – (必需) 搜索这些文件的源文件夹。此文件夹将从 dst 参数中剥离。例如,lib/Debug/x86。
dst – (必需) 目标本地文件夹。它必须与 src 值不同,否则将抛出异常。
keep_path – (可选,默认为
True
) 表示在将文件从 src 文件夹复制到 dst 文件夹时是否保留相对路径。excludes – (可选,默认为
None
) 要从复制中排除的 fnmatch 模式的元组/列表,甚至单个模式。ignore_case – (可选,默认为
True
) 如果启用,将执行不区分大小写的模式匹配。当True
时,将执行不区分大小写的模式匹配。overwrite_equal – (可选,默认为
False
)。如果待复制的文件已存在于目标文件夹中,仅当文件看起来不同时(大小不同、修改时间不同)才真正复制它。
- 返回值:
已复制文件的列表
用法
def package(self):
copy(self, "*.h", self.source_folder, os.path.join(self.package_folder, "include"))
copy(self, "*.lib", self.build_folder, os.path.join(self.package_folder, "lib"))
注意
指向文件或指向文件夹的符号链接将被视为普通文件处理,因此只有当指定模式与文件匹配时才会复制它们。
在目标文件夹中,符号链接将指向完全相同的文件或文件夹,可以是绝对路径或相对路径,用户有责任操纵符号链接,例如,在复制之前将符号链接转换为相对路径,使其指向目标文件夹。
请查看 此处 有关管理符号链接的工具参考。
conan.tools.files.load()¶
- load(conanfile, path, encoding='utf-8')¶
一行加载文件的实用函数。它将管理文件的打开和关闭,并加载二进制编码。返回文件内容。
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。path – 要读取的文件路径
encoding – (可选,默认为
utf-8
):指定输入文件文本编码。
- 返回值:
文件内容
用法
from conan.tools.files import load
content = load(self, "myfile.txt")
conan.tools.files.save()¶
- save(conanfile, path, content, append=False, encoding='utf-8')¶
一行保存文件的实用函数。它将管理文件的打开和关闭,并在必要时创建目录。
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。path – 要创建的文件路径。
content – 要写入文件的内容 (str 或 bytes)。
append – (可选,默认为 False):如果为
True
,内容将附加到现有内容后。encoding – (可选,默认为 utf-8):指定输出文件文本编码。
用法
from conan.tools.files import save
save(self, "path/to/otherfile.txt", "contents of the file")
conan.tools.files.rename()¶
- rename(conanfile, src, dst)¶
实用函数,用于重命名文件或文件夹 src 到 dst,并带有重试功能。
os.rename()
在 Windows 上经常抛出“访问被拒绝”异常。此函数使用 robocopy 重命名文件或文件夹,以避免在 Windows 上出现此异常。- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。src – 要重命名的路径。
dst – 重命名后的路径。
用法
from conan.tools.files import rename
def source(self):
rename(self, "lib-sources-abe2h9fe", "sources") # renaming a folder
conan.tools.files.replace_in_file()¶
- replace_in_file(conanfile, file_path, search, replace, strict=True, encoding='utf-8')¶
在文件
file_path
的内容中,用字符串replace
替换字符串search
。- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。file_path – 执行替换操作的文件路径。
search – 要被替换的字符串。
replace – 用于替换被搜索字符串的字符串。
strict – (可选,默认为
True
) 如果为True
,如果未找到搜索字符串则抛出错误,因此实际上没有进行任何替换。encoding – (可选,默认为 utf-8):指定输入和输出文件的文本编码。
- 返回值:
如果找到模式则为
True
,否则如果 strict 为False
则为False
。
用法
from conan.tools.files import replace_in_file
replace_in_file(self, os.path.join(self.source_folder, "folder", "file.txt"), "foo", "bar")
conan.tools.files.chmod()¶
- chmod(conanfile, path: str, read: bool | None = None, write: bool | None = None, execute: bool | None = None, recursive: bool = False)¶
跨平台更改文件或目录权限。
2.15 版本新增功能。
此函数是 Unix chmod 命令的简单包装,但支持跨平台。建议使用它而不是 os.stat + os.chmod,因为它只更改所有者的目录或文件权限,并避免 umask 的问题。在 Windows 上仅限于更改写入权限。
参数¶
- conanfile对象
当前 recipe 对象。始终使用
self
。- pathstr
要更改权限的文件或目录的路径。
- readbool,可选
如果为
True
,将授予所有者用户文件的读取权限。如果为False
,将删除读取权限。如果为None
,读取权限将保持不变。默认为 None。- writebool,可选
如果为
True
,将授予所有者用户文件的写入权限。如果为False
,将删除写入权限。如果为None
,文件或目录将不会被更改。默认为 None。- executebool,可选
如果为
True
,将授予所有者用户文件的执行权限。如果为False
,将删除执行权限。如果为None
,文件或目录将不会被更改。默认为 None。- recursivebool
如果为
True
,权限将递归应用于指定目录内的所有文件和目录。如果为False
,仅更改指定的文件或目录。默认为 False。
返回值¶
None
示例¶
为打包的 bash 脚本添加执行权限¶from conan.tools.files import chmod chmod(self, os.path.join(self.package_folder, "bin", "script.sh"), execute=True)
conan.tools.files.rm()¶
此函数从文件系统中删除文件。可用于删除单个文件或基于 fnmatch 的模式。建议使用它代替 os.remove
,因为它支持跨平台,并可能避免权限问题。
from conan.tools.files import rm
rm(self, "*.tmp", self.build_folder, recursive=True)
from conan.tools.files import rm
rm(self, "*", self.bin_folder, recursive=False, excludes="*.dll")
- rm(conanfile, pattern, folder, recursive=False, excludes=None)¶
实用函数,用于删除
folder
中匹配pattern
的文件。- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。pattern – 要删除的文件必须匹配的模式 (fnmatch)。
folder – 搜索/删除文件的文件夹。
recursive – 如果指定了
recursive
,它将在子文件夹中搜索。excludes – (可选,默认为 None) 要从删除模式中排除的 fnmatch 模式的元组/列表,甚至单个模式。
conan.tools.files.mkdir()¶
- mkdir(conanfile, path)¶
实用函数,用于创建目录。会检查指定目录是否存在,因此如果目录已存在,mkdir() 将不执行任何操作。
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。path – 要创建的文件夹的路径。
用法
from conan.tools.files import mkdir
mkdir(self, "mydir") # Creates mydir if it does not already exist
mkdir(self, "mydir") # Does nothing
conan.tools.files.rmdir()¶
- rmdir(conanfile, path)¶
用法
from conan.tools.files import rmdir
rmdir(self, "mydir") # Remove mydir if it exist
rmdir(self, "mydir") # Does nothing
conan.tools.files.chdir()¶
- chdir(conanfile, newdir)¶
这是一个上下文管理器,允许临时更改 conanfile 中的当前目录
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。newdir – 要更改当前目录的目录路径名。
用法
from conan.tools.files import chdir
def build(self):
with chdir(self, "./subdir"):
do_something()
conan.tools.files.unzip()¶
此函数将不同的压缩格式(.tar
, .tar.gz
, .tgz
, .tar.bz2
, .tbz2
, .tar.xz
, .txz
和 .zip
)解压到指定的目标文件夹。
它也接受扩展名为 .gz
的 gzipped 文件(不匹配上述任何扩展名),并将其解压为一个同名但没有扩展名的文件,或解压到由 destination
参数定义的文件名。
from conan.tools.files import unzip
unzip(self, "myfile.zip")
# or to extract in "myfolder" sub-folder
unzip(self, "myfile.zip", "myfolder")
可以使用 keep_permissions=True
参数保留文件的权限。
from conan.tools.files import unzip
unzip(self, "myfile.zip", "myfolder", keep_permissions=True)
如果要从存档中过滤出要解压的特定文件和路径,请使用 pattern
参数。
from conan.tools.files import unzip
# Extract only files inside relative folder "small"
unzip(self, "bigfile.zip", pattern="small/*")
# Extract only txt files
unzip(self, "bigfile.zip", pattern="*.txt")
重要
在 Conan 2.8 中,unzip()
提供了一个新的 extract_filter=None
参数,并新增了 tools.files.unzip:filter
配置,以应对未来 Python 3.14 的重大变更,届时提取 tar 存档的 data
过滤器将成为默认值。建议尽快开始使用 data
过滤器(可以在 global.conf
中定义该配置,或在 recipe 的 unzip()
和 get()
助手函数中明确添加该参数),因为这是当前从互联网下载源时的安全建议。
- unzip(conanfile, filename, destination='.', keep_permissions=False, pattern=None, strip_root=False, extract_filter=None)¶
解压不同的压缩格式
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。filename – 压缩文件的路径。
destination – (可选,默认为
.
) 目标文件夹(对于 .gz 文件是文件名)keep_permissions – (可选,默认为
False
) 保留 zip 权限。警告:如果 zip 文件不是在 NIX 系统中创建的,这可能很危险,权限位可能产生未定义的权限方案。仅当您确定 zip 文件创建正确时才使用此选项。pattern – (可选,默认为
None
) 仅解压匹配模式的路径。这应该是一个 Unix shell 风格的通配符,有关详细信息请参见 fnmatch 文档。strip_root – (可选,默认为 False) 如果为 True,并且所有解压内容都在一个单独的文件夹中,它将展平该文件夹,将所有内容移动到父文件夹。
extract_filter – (可选,默认为 None)。提取 tar 文件时,使用 Python 在 https://docs.pythonlang.cn/3/library/tarfile.html 中定义的 tar 提取过滤器。
conan.tools.files.update_conandata()¶
此函数读取 conan 缓存中 exported 文件夹内的 conandata.yml
(如果存在)。如果 conandata.yml
不存在,则会创建它。然后,它使用提供的 data
字典递归更新 conandata 字典,优先使用 data
中的值,但保留其他现有值。最后,conandata.yml
被保存到同一位置。
此助手函数只能在 export()
方法中使用,否则可能抛出异常。一个应用是在 conandata.yml
中捕获 scm 坐标(例如 Git 远程 url 和提交),以便稍后在 source()
方法中恢复它,并拥有可重现的 recipe,可以直接从源代码构建而无需实际在 recipe 中存储源代码。
- update_conandata(conanfile, data)¶
用于在导出后修改
conandata.yml
的工具。例如,可用于添加 scm 的额外数据,如“commit”和“url”。
修改内容,清除属于其他版本(与导出版本不同)的数据,以避免在更改的数据不属于当前版本时改变 recipe 修订版。
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。data – (必需) 用于更新值的字典(可以是嵌套的)
conan.tools.files.trim_conandata()¶
- trim_conandata(conanfile, raise_if_missing=True)¶
用于在导出后修改
conandata.yml
的工具,仅限于当前版本
警告
conan.tools.files.trim_conandata()
函数处于 预览 阶段。有关更多信息,请参阅 Conan 稳定性 部分。
此函数修改 conan 缓存中 exported 文件夹内的 conandata.yml
(如果存在),并仅保留与当前构建版本相关的信息。
此助手函数只能在 export()
方法或 post_export()
hook 中使用,否则未来可能会抛出异常。一个应用是确保 conandata.yml
文件中与某些版本相关的更改不影响其余版本的 recipe 修订版的生成。
用法
from conan import ConanFile
from conan.tools.files import trim_conandata
class Pkg(ConanFile):
name = "pkg"
def export(self):
# any change to other versions in the conandata.yml
# won't affect the revision of the version that is built
trim_conandata(self)
conan.tools.files.collect_libs()¶
- collect_libs(conanfile, folder=None)¶
返回位于
conanfile.cpp_info.libdirs
(默认)或相对于 package 文件夹的 folder 目录内的库文件(扩展名为 .so, .lib, .a 和 .dylib)的库名称的排序列表。这对于收集不相互依赖的库或名称复杂的库(如libmylib-x86-debug-en.lib
)非常有用。对于以 lib 开头的 UNIX 库,如 libmath.a,此工具将收集库名称 math。
- 参数:
conanfile – 当前 recipe 对象。始终使用
self
。folder – (可选,默认为
None
):字符串,指示conanfile.package_folder
中包含库文件的子文件夹名称。
- 返回值:
包含库名称的列表
警告
此工具直接在 package 文件夹内搜索库,并以无特定顺序返回它们。如果库相互依赖,则 package_info()
方法应该对它们进行排序以实现正确的链接顺序。
用法
from conan.tools.files import collect_libs
def package_info(self):
self.cpp_info.libdirs = ["lib", "other_libdir"] # Default value is 'lib'
self.cpp_info.libs = collect_libs(self)
对于以 lib 开头的 UNIX 库,如 libmath.a,此工具将收集库名称 math。关于符号链接,此工具将仅保留解析后的实际文件和所有指向该实际文件的符号链接中“最通用”的文件。例如,在下面的文件中,此工具将选择 libmath.dylib 文件,因此只将 math 添加到返回列表中
-rwxr-xr-x libmath.1.0.0.dylib lrwxr-xr-x libmath.1.dylib -> libmath.1.0.0.dylib
lrwxr-xr-x libmath.dylib -> libmath.1.dylib