La generazione del setup, il versionamento e il caricamento su Gitea passano ora da un solo file MSBuild in build/Release.proj, com'e' gia' per AutoBidder, al posto dello script PowerShell make-installer.ps1. Il cambiamento di sostanza e' da dove viene la versione: dal tag git, non piu' da Directory.Build.props. Il numero arriva a dotnet publish come proprieta' da riga di comando, quindi tag, eseguibile, installatore e release lo portano uguale per costruzione invece che per disciplina. Il tag si crea in fondo, a installatore esistente, e non si crea affatto se l'albero e' sporco: un giro andato male non lascia dietro un tag per una versione mai costruita. Tre adattamenti rispetto ad AutoBidder, segnati sul posto: la versione sta in Directory.Build.props e non nel csproj; la pubblicazione produce una cartella e non un eseguibile unico, perche' l'app legge encelado.json accanto a se', quindi la copia portabile allegata alla release e' uno zip; il target Backtest rigioca serie storiche di prezzi invece dei dossier delle aste. Il setup si chiama Encelado_<versione>.exe e la pubblicazione ora fallisce se nella cartella finiscono sorgenti o simboli di debug. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
154 lines
6.4 KiB
Plaintext
154 lines
6.4 KiB
Plaintext
; ─────────────────────────────────────────────────────────────────────────────
|
|
; Encelado — script di installazione (Inno Setup 6)
|
|
;
|
|
; Non si compila a mano: lo lancia build/Release.proj, che prima pubblica
|
|
; l'applicazione e poi passa qui versione e percorsi con /D. Compilarlo da solo
|
|
; produrrebbe un pacchetto con la versione sbagliata, perché il numero vive nel
|
|
; tag git e non in questo file.
|
|
;
|
|
; dotnet msbuild build/Release.proj -t:Pacchetto
|
|
;
|
|
; ── Due differenze rispetto ad AutoBidder.iss ───────────────────────────────
|
|
;
|
|
; La prima: Encelado non è un eseguibile unico. È una cartella — l'applicazione
|
|
; legge encelado.json accanto a sé — quindi si copia SourceDir, non SourceExe.
|
|
;
|
|
; La seconda: l'installazione è per utente e non è possibile forzarla altrove.
|
|
; Non è per evitare l'UAC. Encelado scrive log, diario operazioni e CSV di
|
|
; analisi accanto al proprio eseguibile: dentro C:\Program Files quelle
|
|
; scritture fallirebbero, e siccome il logger degrada in silenzio piuttosto che
|
|
; fermare il bot, l'utente se ne accorgerebbe solo cercando i log per capire
|
|
; cosa è successo — cioè nel momento peggiore.
|
|
; ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
#ifndef AppVersion
|
|
#define AppVersion "0.0.0"
|
|
#endif
|
|
|
|
#ifndef SourceDir
|
|
#define SourceDir "..\bin\publish\win-x64"
|
|
#endif
|
|
|
|
#ifndef OutputDir
|
|
#define OutputDir "..\bin\installer"
|
|
#endif
|
|
|
|
#define AppName "Encelado"
|
|
#define AppPublisher "Alberto Balbo"
|
|
#define AppExeName "Encelado.exe"
|
|
#define AppDescription "Bot di trading automatico su Alpaca"
|
|
|
|
[Setup]
|
|
; L'AppId identifica il prodotto fra una versione e l'altra: cambiarlo farebbe
|
|
; comparire due voci in "App installate" invece di un aggiornamento.
|
|
AppId={{7C4F1E62-2B8A-4D19-9C55-3E0A6B1D8F44}
|
|
AppName={#AppName}
|
|
AppVersion={#AppVersion}
|
|
AppVerName={#AppName} {#AppVersion}
|
|
AppPublisher={#AppPublisher}
|
|
VersionInfoVersion={#AppVersion}
|
|
VersionInfoDescription={#AppDescription}
|
|
|
|
; Vedi la nota in testa al file: l'applicazione deve poter scrivere nella
|
|
; propria cartella, quindi l'installazione resta nel profilo dell'utente e non
|
|
; è consentito spostarla altrove.
|
|
PrivilegesRequired=lowest
|
|
PrivilegesRequiredOverridesAllowed=
|
|
DefaultDirName={autopf}\{#AppName}
|
|
DefaultGroupName={#AppName}
|
|
DisableProgramGroupPage=yes
|
|
DisableDirPage=auto
|
|
|
|
OutputDir={#OutputDir}
|
|
OutputBaseFilename=Encelado_{#AppVersion}
|
|
SetupIconFile=..\src\Encelado.Bot\Assets\encelado.ico
|
|
UninstallDisplayIcon={app}\{#AppExeName}
|
|
UninstallDisplayName={#AppName} {#AppVersion}
|
|
|
|
Compression=lzma2/max
|
|
SolidCompression=yes
|
|
WizardStyle=modern
|
|
ArchitecturesAllowed=x64compatible
|
|
ArchitecturesInstallIn64BitMode=x64compatible
|
|
|
|
; Se Encelado è in esecuzione, il Restart Manager lo chiude invece di lasciare
|
|
; l'installazione a metà con i file bloccati.
|
|
CloseApplications=yes
|
|
RestartApplications=no
|
|
|
|
[Languages]
|
|
Name: "italiano"; MessagesFile: "compiler:Languages\Italian.isl"
|
|
|
|
[Tasks]
|
|
Name: "desktopicon"; Description: "Crea un collegamento sul desktop"; GroupDescription: "Collegamenti:"
|
|
|
|
[Files]
|
|
; Tutto il publish tranne la configurazione, che ha una regola sua, e i simboli
|
|
; di debug, che non servono a chi installa.
|
|
Source: "{#SourceDir}\*"; DestDir: "{app}"; \
|
|
Excludes: "encelado.json,*.pdb,*.xml,logs\*"; \
|
|
Flags: ignoreversion recursesubdirs createallsubdirs
|
|
|
|
; La configurazione è il prodotto — ogni numero dentro encelado.json è tarato su
|
|
; due dataset indipendenti — ma è anche l'unico posto dove l'utente mette mano,
|
|
; dalla scheda Impostazioni o a mano. "onlyifdoesntexist" fa sì che un
|
|
; aggiornamento non cancelli quelle modifiche; "uninsneveruninstall" che una
|
|
; disinstallazione non le butti via. Le chiavi nuove introdotte da una versione
|
|
; successiva non rompono nulla: il loader usa i valori di default per quelle che
|
|
; non trova.
|
|
Source: "{#SourceDir}\encelado.json"; DestDir: "{app}"; \
|
|
Flags: onlyifdoesntexist uninsneveruninstall
|
|
|
|
; Copia sempre aggiornata dei valori di fabbrica, per poter vedere cosa è
|
|
; cambiato rispetto al proprio encelado.json dopo un aggiornamento.
|
|
Source: "{#SourceDir}\encelado.json"; DestDir: "{app}"; \
|
|
DestName: "encelado.default.json"; Flags: ignoreversion
|
|
|
|
[Icons]
|
|
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Comment: "{#AppDescription}"
|
|
Name: "{group}\Disinstalla {#AppName}"; Filename: "{uninstallexe}"
|
|
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; \
|
|
Comment: "{#AppDescription}"; Tasks: desktopicon
|
|
|
|
[Run]
|
|
Filename: "{app}\{#AppExeName}"; Description: "Avvia {#AppName}"; \
|
|
Flags: nowait postinstall skipifsilent
|
|
|
|
[UninstallDelete]
|
|
; Prodotti a runtime, quindi non tracciati dall'installatore: senza questo
|
|
; resterebbero una cartella e dei file orfani.
|
|
Type: filesandordirs; Name: "{app}\logs"
|
|
Type: dirifempty; Name: "{app}"
|
|
|
|
[Code]
|
|
{ Le credenziali Alpaca vivono in %LocalAppData%\Encelado, fuori dalla cartella
|
|
di installazione, quindi una disinstallazione normale non le toccherebbe.
|
|
Lasciarle lì in silenzio però significa lasciare sul disco una chiave API
|
|
cifrata di cui l'utente si è dimenticato. Glielo chiediamo, con il "no" come
|
|
risposta predefinita: chi disinstalla per reinstallare una versione nuova non
|
|
deve ritrovarsi a reinserire le chiavi solo perché ha premuto Invio di fretta. }
|
|
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
|
var
|
|
DataDir: String;
|
|
begin
|
|
if CurUninstallStep <> usPostUninstall then
|
|
Exit;
|
|
|
|
{ In modalità silenziosa non c'è nessuno a cui chiedere, e la risposta che non
|
|
si può disfare è quella che cancella. Nel dubbio le credenziali restano. }
|
|
if UninstallSilent then
|
|
Exit;
|
|
|
|
DataDir := ExpandConstant('{localappdata}\Encelado');
|
|
if not DirExists(DataDir) then
|
|
Exit;
|
|
|
|
if MsgBox(
|
|
'Vuoi eliminare anche le credenziali Alpaca salvate?' + #13#10#13#10 +
|
|
DataDir + #13#10#13#10 +
|
|
'Scegli No se hai intenzione di reinstallare Encelado: le credenziali '
|
|
+ 'verranno riconosciute dalla nuova installazione.',
|
|
mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then
|
|
DelTree(DataDir, True, True, True);
|
|
end;
|