package()¶
The package() 方法负责将文件从 source_folder 和临时 build_folder 复制到 package_folder,仅复制将包含在最终包中的文件和工件,例如头文件、编译器静态库和共享库、可执行文件、许可文件等。
对于创建新包二进制文件的不同配置,将调用 package() 方法一次,这发生在 conan install --build=pkg*、conan create 和 conan export-pkg 命令中。
有两种主要方法可以实现 package() 方法的复制。第一种是从源 source_folder 和 build_folder 到 package folder 的显式 copy()
from conan import ConanFile
from conan.tools.files import copy
class Pkg(ConanFile):
def package(self):
# copying headers from source_folder
copy(self, "*.h", join(self.source_folder, "include"), join(self.package_folder, "include"))
# copying compiled .lib from build folder
copy(self, "*.lib", self.build_folder, join(self.package_folder, "lib"), keep_path=False)
第二种方法是使用某些构建系统的 install 功能,前提是构建脚本实现此功能。例如,如果包的 CMakeLists.txt 实现了正确的 CMake INSTALL 指令,则可以执行
def package(self):
cmake = CMake(self)
cmake.install()
此外,也可以结合使用这两种方法,执行 cmake.install() 并添加一些 copy() 调用,例如,以确保 CMakeLists.txt 脚本未考虑到的某些“License.txt”文件被打包。
也可以在 package() 方法中使用条件语句,因为不同的平台可能在不同的位置具有不同的工件
def package(self):
if self.settings.os == "Windows":
copy(self, "*.lib", src=os.path.join(self.build_folder, "libs"), ...)
copy(self, "*.dll", ....)
else:
copy(self, "*.lib", src=os.path.join(self.build_folder, "build", "libs"), ...)
虽然在大多数情况下可能不需要,因为基于模式的复制可能无法找到错误的工件,例如在非 Windows 构建中的 *.dll。
当使用 conan export-pkg 打包预编译二进制文件时,也会调用 package() 方法。在这种情况下,self.source_folder 和 self.build_folder 指的是用户空间文件夹,如 layout() 方法所定义,并且 Conan 缓存中的唯一文件夹将是 self.package_folder。
注意
最佳实践
应在 package() 方法中调用 cmake.install() 功能,而不是在 build() 方法中。没有必要重用 CMake(self) 对象,不应在方法之间重用。在每个方法中创建一个新实例是推荐的方法。
另请参阅
有关更多信息,请参阅 package() 方法教程。