如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?
Posted
技术标签:
【中文标题】如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?【英文标题】:How do I show an uninstaller window with CPack NSIS during re-installation? 【发布时间】:2021-12-03 19:21:07 【问题描述】:我有以下CMakeLists.txt
(目录中唯一的东西):
cmake_minimum_required(VERSION 3.0.0)
project(CPackUninstallerTest)
set(CPACK_GENERATOR NSIS)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
"DetailPrint \\\"Sleeping...\\\"
Sleep 3000"
)
file(WRITE "$CMAKE_CURRENT_BINARY_DIR/test.txt" "Some output\n")
install(FILES "$CMAKE_CURRENT_BINARY_DIR/test.txt" TYPE DATA)
include(CPack)
运行cmake
和cpack
工作正常,并生成.../build/CPackUninstallerTest-0.1.1-win64.exe
。
运行安装程序按预期工作:
运行卸载程序(安装目录中的Uninstall.exe
)也可以,睡眠需要三秒钟:
但是,如果我尝试在现有安装之上进行安装,则不会显示此卸载窗口。在此处单击是后:
在新的安装程序运行之前,该窗口会消失三秒钟(因为它正在卸载)。
这是一种糟糕的用户体验,导致他们在等待隐藏的卸载程序时重新运行安装程序,从而导致结果混乱。
如何配置 NSIS 或 CMake/CPack 以在使用 CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL
并重新安装时显示卸载程序进度条?
【问题讨论】:
我认为这是 CPACK 正在做的事情。不确定它是否是用户可配置的。 【参考方案1】:CMake 的 NSIS 接口无法解决您的问题。
CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL
也有类似的问题。手动卸载时用户无法再次安装。
这里的问题是手动运行卸载程序不会从 Windows 注册表项中删除安装标志。
我的建议是您可以使用 CMake 的 NSIS 模板脚本来创建您的 NSIS 脚本。您可以轻松地将删除命令添加到新脚本的卸载程序部分。
然后您可以将新脚本作为模板提供给 CMake。
【讨论】:
以上是关于如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?的主要内容,如果未能解决你的问题,请参考以下文章
CPack:如何执行多个 CPACK_NSIS_EXTRA_INSTALL_COMMANDS?
如何使用 CPACK_NSIS_WELCOME_TITLE 和 CPACK_NSIS_FINISH_TITLE?