我正在使用Inno Setup来创建安装程序.
我希望安装程序自动卸载以前安装的版本,而不是覆盖它.我怎样才能做到这一点?
是否有可能告诉 Innosetup 卸载应用程序的 32 位版本(通常驻留在 中Program Files (x86)
)以安装应用程序的 64 位版本(通常在 中Program Files
)。如果没有卸载32位版本,那么它们的bot会在启动时启动,导致问题。
不知道有没有这方面的手续。鉴于 64 位应用程序基本上将是一个不同的应用程序,尝试卸载 32 位应用程序似乎试图卸载一个不相关的应用程序。
动机是越来越少的供应商提供对 32 位库的支持。例如,msvc2017 没有用于 Qt 的 32 位库。所以我越早迁移到 64 位越好。
注意:如果这在 Innosetup 中无法实现,欢迎使用任何其他替代方法。
我正在使用Inno Setup为 Windows 打包 Java 应用程序;应用程序树是这样的:
| MyApp.jar
\---lib
| dependency-A-1.2.3.jar
| dependency-B-2.3.4.jar
| dependency-Z-x.y.z.jar
Run Code Online (Sandbox Code Playgroud)
我使用Ant预先准备整个树(所有文件和文件夹),包括lib
目录(使用*.jar
通配符复制依赖项),然后我只需调用ISCC
:
[Files]
Source: "PreparedFolder\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
Run Code Online (Sandbox Code Playgroud)
现在,每次用户升级应用程序时我都需要清理lib
目录,因为我想删除任何过时的依赖项。我可以将以下部分添加到我的.iss
文件中:
[InstallDelete]
{app}\lib\*.jar
Run Code Online (Sandbox Code Playgroud)
但我觉得不安全,因为如果用户决定将应用程序安装在包含非空文件夹的现有文件夹中 lib
文件夹(罕见但并非不可能),则升级时可能会删除某些用户文件。
是否有一些最佳实践可以避免这种麻烦?其他安装人员是否会解决这些令人头疼的问题?谢谢。
我知道如何使用这种方法覆盖文件
[Files]
Source: "Project\*"; DestDir: "{app}"; \
Flags: ignoreversion recursesubdirs onlyifdoesntexist; Permissions: everyone-full
Run Code Online (Sandbox Code Playgroud)
但是,当我使用“安装或更改程序”部分中的“更改”选项更改程序时,我不想覆盖这些文件。
我为我的安装程序创建更改选项,如下所示:
[setup]
AppModifyPath="{srcexe}" /modify=1
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?