CPack NSIS打包数字版本号失败及miniconda打包异常排查
CPack NSIS打包异常根因说明
核心配置与报错复现
问题涉及的installer.cmake核心配置如下:
# --------------------------------------------------------------------------------------- # set the variables for the call to CPack SET(CPACK_PACKAGE_NAME "Kappa") set(CPACK_NSIS_PACKAGE_NAME "Kappa") set(CPACK_NSIS_DISPLAY_NAME "Kappa") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A great app.") SET(CPACK_PACKAGE_DIRECTORY ${PACKAGING_DIR}) SET(CPACK_PACKAGE_VENDOR "Me") SET(CPACK_PACKAGE_VERSION_MAJOR 19) SET(CPACK_PACKAGE_VERSION_MINOR 2) SET(CPACK_PACKAGE_VERSION_PATCH 12) SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/eula_licence.txt") include(CPack)
执行打包时的报错信息:
EXEC : CPack error : Problem running NSIS command: "C:/Program Files (x86)/NSIS/makensis.exe" "D:/Workspace/Packaging/_CPack_Packages/win64/NSIS/project.nsi" [D:\Workspace\build_fixed\package.vcxproj] EXEC : CPack error : Problem compressing the directory [D:\Workspace\build_fixed\package.vcxproj] EXEC : CPack error : Error when generating package: Kappa [D:\Workspace\build_fixed\package.vcxproj]
问题1:数字版本号打包失败、非数字版本号正常的根因
- 触发逻辑来自CPack内置的隐式判断规则:当
CPACK_PACKAGE_VERSION_MAJOR为纯数字时,无论是否加引号,CMake解析阶段都会将其识别为数值类型,此时CPack会自动进入源码包构建分支,强制将包名后缀设置为Source,覆盖原本应写入的win64架构标识。 - 分支错配直接导致路径参数异常:待打包文件实际已被组装到
Kappa-19-win64目录,但CPack传给NSIS的工作路径、输出路径规则均按照源码包逻辑生成,NSIS无法找到对应待压缩目录,直接抛出压缩目录失败的错误。 - 当版本号字段为非数字字符串时,CPack不会触发源码包分支,正常走二进制安装包构建流程,win64架构标识会被正确拼接进文件名,路径参数匹配正常,因此打包可以顺利完成。
- 修复方式:在
include(CPack)前显式强制设置包文件名规则,覆盖CPack的自动生成逻辑:set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-win64")
问题2:miniconda目录触发NSIS File /r递归指令报错的根因
该问题和CPack逻辑无关,是NSIS本身的限制与miniconda目录特性冲突导致,常见触发原因有三类:
- 单包体积超限:NSIS默认编译生成的安装包单文件最大支持约2GB,若打包的miniconda环境总大小超过该阈值,递归压缩过程会直接中断报错。
- 长路径限制:miniconda安装的Python包普遍存在多层嵌套目录,大量文件的完整路径长度超过Windows默认260字符限制,NSIS的
File指令默认不支持长路径读取,遇到这类文件会直接读取失败。 - 文件权限/占用问题:miniconda目录下部分自带文件带有特殊权限位、隐藏属性,或打包时被其他进程占用,NSIS无权限读取/访问这类文件时,会终止递归打包流程。
- 处理建议:不要直接用
File /r递归打包miniconda零散文件,提前将miniconda目录压缩为7z高压包,在NSIS脚本中改为安装阶段解压该压缩包,可同时绕开长路径、体积超限问题,还能大幅缩小安装包体积。如果需要定位具体报错文件,可手动在命令行执行makensis编译生成的project.nsi,开启NSIS详细日志即可定位到读取失败的具体文件路径。
内容的提问来源于stack exchange,提问作者jpmorr
相关产品推荐
相关产品推荐

