如何将多个jpackage安装包置于同一父目录且卸载仅删除子目录?
解决jpackage卸载时仅删除子文件夹的方案
以下是几种无需依赖第三方变通方案的可行方法:
1. 预创建父目录再执行打包
如果parent_directory在安装程序运行前就已存在,jpackage会将其视为系统原有目录,卸载时仅清理自己创建的child_folder,不会删除父目录。
- 操作步骤:
- 在打包或安装前,通过脚本提前创建父目录:
- Linux/macOS:
mkdir -p parent_directory - Windows:
md parent_directory
- Linux/macOS:
- 之后正常执行jpackage命令,指定
--install-dir parent_directory/child_folder即可。
- 在打包或安装前,通过脚本提前创建父目录:
2. 自定义安装资源修改卸载逻辑
利用jpackage的--resource-dir参数,替换或补充安装程序的底层脚本,让父目录不被标记为安装创建的目录:
- 针对不同系统的具体操作:
- Windows(NSIS):在自定义的NSIS脚本中,手动创建
parent_directory(如果不存在),但不将其加入卸载清理列表,仅将child_folder纳入卸载范围。 - macOS(pkg):修改pkg的安装脚本,确保
parent_directory的创建操作不被记录到卸载清单中,只标记child_folder为需要清理的目录。 - Linux(deb/rpm):在post-install脚本中创建父目录,同时确保卸载脚本仅删除子文件夹,不处理父目录。
- Windows(NSIS):在自定义的NSIS脚本中,手动创建
3. 将父目录设为共享组件
把parent_directory封装为一个独立的共享组件安装包,先安装该组件(仅创建父目录,无其他内容),再为每个应用执行jpackage打包,指定--install-dir parent_directory/child_folder:
- 优势:多个应用共享同一父目录时,只有当所有依赖该父目录的应用都卸载后,共享组件才会删除父目录;单个应用卸载仅清理自身的
child_folder。 - 实现要点:共享组件包需设置合适的依赖规则,确保父目录在有应用使用时不会被误删。
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

