Sie können die vorherige Version vor der Installation deinstallieren:
Wenn Sie nicht eine vollständige Deinstallation tun, würden Sie eine partielle Deinstallation implementieren müssen .
Ideal wäre, das Uninstaller-Protokoll rückzuentwickeln (unins000.dat
), extrahieren Sie nur Installationen in den Unterordner lib
, und verarbeiten Sie sie (rückgängig machen). Da es sich jedoch um eine undokumentierte Binärdatei handelt, kann dies schwierig sein.
Wenn Sie eine explizite Liste von Dateien halten im [Files]
Abschnitt installiert werden, wie
[Files]
Source: "lib\dependency-A-1.2.3.jar"; Dest: "{app}\lib"
Source: "lib\dependency-B-2.3.4.jar"; Dest: "{app}\lib"
dann, wenn eine Abhängigkeit ändert, bewegen Sie die vorherige Version der [InstallDelete]
Abschnitt:
[Files]
Source: "lib\dependency-A-1.3.0.jar"; Dest: "{app}"
Source: "lib\dependency-B-2.3.4.jar"; Dest: "{app}"
[InstallDelete]
{app}\lib\dependency-A-1.2.3.jar
Wenn Sie die Abhängigkeiten mit einem Platzhalter installieren,
[Files]
Source: "lib\*.jar"; Dest: "{app}\lib"
und Sie können das Deinstallationsprogramm Protokoll nicht Reverse-Engineering, würden Sie seine Funktionalität durch eigene Mittel replizieren müssen.
Sie können eine preprocessor verwenden, um eine Datei mit installierten Abhängigkeiten zu generieren. Installieren Sie diese Datei im Ordner {app}
und verarbeiten Sie die Datei vor der Installation.
[Files]
Source: "MyApp.jar"; DestDir: "{app}"
Source: "lib\*.jar"; DestDir: "{app}\lib"
#define ProcessFile(Source, FindResult, FindHandle) \
Local[0] = FindGetFileName(FindHandle), \
Local[1] = Source + "\\" + Local[0], \
Local[2] = FindNext(FindHandle), \
"'" + Local[0] + "'#13#10" + \
(Local[2] ? ProcessFile(Source, Local[2], FindHandle) : "")
#define ProcessFolder(Source) \
Local[0] = FindFirst(Source + "\\*.jar", faAnyFile), \
ProcessFile(Source, Local[0], Local[0])
#define DepedenciesToInstall ProcessFolder("lib")
#define DependenciesLog "{app}\dependencies.log"
[UninstallDelete]
Type: files; Name: "{#DependenciesLog}"
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
AppPath, DependenciesLogPath: string;
Dependencies: TArrayOfString;
Count, I: Integer;
begin
DependenciesLogPath := ExpandConstant('{#DependenciesLog}');
if CurStep = ssInstall then
begin
{ If dependencies log already exists, remove the previously installed dependencies }
if LoadStringsFromFile(DependenciesLogPath, Dependencies) then
begin
Count := GetArrayLength(Dependencies);
Log(Format('Loaded %d dependencies, deleting...', [Count]));
for I := 0 to Count - 1 do
DeleteFile(ExpandConstant('{app}\lib\' + Dependencies[I]));
end;
end
else
if CurStep = ssPostInstall then
begin
{ Now that the app folder already exists, }
{ save dependencies log (to be processed by future upgrade) }
if SaveStringToFile(DependenciesLogPath, {#DepedenciesToInstall}, False) then
begin
Log('Created dependencies log');
end
else
begin
Log('Failed to create dependencies log');
end;
end;
end;
Danke sehr. Es funktioniert gut, außer für die erste Installation, weil '{app} \ lib' 'nicht vor der Installation existiert, also versuche ich das zu beheben. –
Stimmt, ich habe meine Antwort behoben. –