2017-09-01 2 views
1

Ich verwende Inno Setup, um eine Java-Anwendung für Windows zu packen; die Anwendung Baum ist wie folgt:Inno-Setup: Entfernen von Dateien, die mit der vorherigen Version installiert wurden

| MyApp.jar 
\---lib 
    | dependency-A-1.2.3.jar 
    | dependency-B-2.3.4.jar 
    | dependency-Z-x.y.z.jar 

ich Ant verwenden den ganzen Baum (alle Dateien und Ordner) im voraus, einschließlich der lib Verzeichnis (mit *.jar Wildcard zu kopieren, die Abhängigkeiten) herzustellen, dann habe ich einfach rufen ISCC mit:

[Files] 
Source: "PreparedFolder\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs 

Nun ich Bereinigung müssen die lib Verzeichnis jedes Mal der Benutzer die Anwendung aktualisiert, weil ich will ein entfernen y veraltete Abhängigkeiten. Ich konnte den folgenden Abschnitt in meine .iss Datei hinzufügen:

[InstallDelete] 
{app}\lib\*.jar 

aber ich fühle mich nicht sicher, weil, wenn ein Benutzer entscheidet, die Anwendung in einem vorhandenen Ordner zu installieren, die einen nicht-leeren lib Unterordner (selten enthält aber nicht unmöglich), besteht die Möglichkeit, dass einige Benutzerdateien beim Upgrade gelöscht werden.

Gibt es einige Best Practices, um diese Art von Problemen zu vermeiden? Bereiten andere Installateure diese Kopfschmerzen vor? Vielen Dank.

Antwort

1

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; 
+0

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. –

+1

Stimmt, ich habe meine Antwort behoben. –

Verwandte Themen