如何配置CPack自动删除deb打包时生成的临时deb包文件
解决方法
CPack的DEB生成器默认没有提供专门的配置项用来在复制完安装包后自动删除临时目录下的deb文件,可通过以下两种方式解决问题:
- 方法一:嵌入CPack后置清理脚本
在现有CMake配置的include(CPack)语句前添加配置,指定打包完成后执行自定义清理脚本:
在工程根目录新建set(CPACK_POST_BUILD_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/cpack_post_clean.cmake")cpack_post_clean.cmake文件,写入如下清理逻辑:
该方式将清理逻辑固化在工程配置中,本地打包和CI流水线执行行为完全一致,不需要额外调整打包命令。if(CPACK_GENERATOR STREQUAL "DEB") # 删除临时目录下生成的deb副本 file(REMOVE "${CPACK_TEMPORARY_PACKAGE_FILE_NAME}") # 若不需要保留任何临时打包文件,可直接删除整个临时工作目录 # file(REMOVE_RECURSE "${CPACK_TOPLEVEL_DIRECTORY}") endif() - 方法二:调整CI打包命令逻辑
不需要修改CMake工程配置,直接在打包脚本中指定独立临时目录,打包完成后提取产物再整体删除临时目录即可:
该方式从根源上避免了通配符误匹配临时目录deb包的问题,也不会出现双倍磁盘占用的情况,适合在CI流水线中快速适配。# 指定CPack临时工作目录为独立文件夹 cpack -B ./cpack_temp_workdir . # 移动生成的deb包到目标输出目录 mv ./cpack_temp_workdir/*.deb ./ # 整体删除临时目录,无残留文件 rm -rf ./cpack_temp_workdir
补充:CMake 3.20及以上版本的DEB生成器新增了
CPACK_DEBIAN_PACKAGE_TEMPORARY_DIR_CLEANUP参数,设置为ON时可自动清理临时打包目录,但该参数不兼容低版本CMake,使用前需要确认环境中的CMake版本。
内容的提问来源于stack exchange,提问作者Tareq A. Siraj
相关产品推荐
相关产品推荐

