finalize()¶
警告
此功能为实验性功能,可能会有重大更改。 请参阅 Conan 稳定性 部分了解更多信息。
包的不可变性是 Conan 中一个重要的概念。 它确保包在构建和打包后不会被修改,从而保证包 ID 的一致性,并且包可以在不同的机器上重用。
此方法旨在自定义运行机器中的包,允许修改将由包的使用者使用的包,但不会修改 Conan 缓存中的原始包。 此方法在包安装到本地缓存后调用,并且修改不会上传到任何远程服务器,它们仅是本地的。
此方法的主要用例包括
拥有在运行时被修改的不同包(例如,生成 pycache 文件作为其执行一部分的 Python 工具)
修改要在本地机器中使用的包(例如,创建一个
conf
文件,其中包含包在本地机器中使用所需的环境变量)
这些更改对包的使用者是透明的,他们将使用自定义的包,就像他们正在处理原始包一样,因此在此方法中所做的更改应该有效。
finalize() 用法示例¶
此方法最常见的用例是避免破坏包的不可变性。
例如,如果一个包在其执行过程中生成一些文件,例如生成 pycache 文件的 Python 包,则可以使用此方法在本地机器中生成这些文件,而不会影响原始包。 对于像 Meson 这样的工具来说就是这种情况。
from conan import ConanFile, conan_version
from conan.tools.files import copy
class MesonPackage(ConanFile):
...
def package(self):
copy(self, "*", src=self.source_folder, dst=os.path.join(self.package_folder, "bin"))
...
def finalize(self):
copy(self, "*", src=self.immutable_package_folder, dst=self.package_folder)
这里我们将文件从不可变的包文件夹复制到最终的包文件夹,在 finalize 方法内部(以及之后的任何地方)将是新的包文件夹,以便包所做的任何修改都在本地最终文件夹中完成,而不会影响原始包。
对于需要访问原始包的情况,immutable_package_folder
属性可以在同一配方的 self.immutable_package_folder
中使用,也可以通过依赖项配方中的 self.dependencies[<package_name>].immutable_package_folder
属性访问。 此信息也会作为图形信息的一部分在 conan graph info 等中序列化。
由于此方法必须与生成的包 ID 有一对一的对应关系,因此禁止在 finalize()
方法内部访问 self.settings
、 self.options
和 self.cpp_info
,并且必须通过 self.info
属性进行。
注意
如果不使用这种方法,包会在包文件夹中生成 pycache 文件,因此需要设置 PYTHONDONTWRITEBYTECODE
来避免修改包,但这会影响性能,并且如果修改后的包被检查,则通过 conan cache check-integrity 执行缓存完整性检查或作为 conan upload ... --check 上传过程的一部分会引发错误。
警告
这不是 post_package 钩子的替代品。 钩子在包创建后运行,以便在计算 package_id 之前有机会修改它,但它不是用于为特定运行机器修改包的。