feat: empaquetado .exe con instalador y fix conexion SCAII
- launcher.py reescrito para PyInstaller (Voila in-process, kernel router) - build_exe.bat: script PyInstaller (onedir + collect-all dependencias Jupyter) - build_installer.bat + installer.iss: instalador Inno Setup - schema_registro_sqlite.sql: schema DataStage en SQLite - _make_conn_str ahora respeta SCAII_TRUSTED (Windows Auth) - .env.example: quitar variables DB_* (Postgres ya no usado por DataStage) - requirements.txt: quitar psycopg2-binary Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
67
app/installer.iss
Executable file
67
app/installer.iss
Executable file
@@ -0,0 +1,67 @@
|
||||
; ============================================================
|
||||
; Instalador de Utilerias RECON 2
|
||||
; Empaqueta dist\UtileriasReconV2\ en un instalador .exe unico.
|
||||
; Requiere Inno Setup 6+: https://jrsoftware.org/isdl.php
|
||||
; ============================================================
|
||||
|
||||
#define MyAppName "Utilerias RECON 2"
|
||||
#define MyAppVersion "1.0.0"
|
||||
#define MyAppPublisher "Tecma / CurtManufacturing"
|
||||
#define MyAppExeName "UtileriasReconV2.exe"
|
||||
|
||||
[Setup]
|
||||
AppId={{B3F1A7A8-4D2E-4A6B-9C5A-2C0D1F8E9A11}
|
||||
AppName={#MyAppName}
|
||||
AppVersion={#MyAppVersion}
|
||||
AppPublisher={#MyAppPublisher}
|
||||
DefaultDirName={autopf}\UtileriasReconV2
|
||||
DefaultGroupName={#MyAppName}
|
||||
DisableProgramGroupPage=yes
|
||||
OutputDir=installer_output
|
||||
OutputBaseFilename=UtileriasReconV2_Setup_{#MyAppVersion}
|
||||
Compression=lzma2/ultra64
|
||||
SolidCompression=yes
|
||||
ArchitecturesAllowed=x64compatible
|
||||
ArchitecturesInstallIn64BitMode=x64compatible
|
||||
PrivilegesRequired=lowest
|
||||
PrivilegesRequiredOverridesAllowed=dialog
|
||||
WizardStyle=modern
|
||||
UninstallDisplayIcon={app}\{#MyAppExeName}
|
||||
|
||||
[Languages]
|
||||
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
|
||||
|
||||
[Tasks]
|
||||
Name: "desktopicon"; Description: "Crear acceso directo en el escritorio"; GroupDescription: "Iconos adicionales:"
|
||||
|
||||
[Files]
|
||||
; Empaqueta TODA la carpeta dist\UtileriasReconV2\ generada por PyInstaller.
|
||||
; Excluimos *.map (source maps de JS, solo para debug del browser, no se usan)
|
||||
; porque tienen nombres absurdamente largos y rompen la compresion.
|
||||
Source: "dist\UtileriasReconV2\*"; DestDir: "{app}"; Excludes: "*.map"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||
; Plantilla .env (el usuario la copia como .env y edita)
|
||||
Source: "..\.env.example"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
[Icons]
|
||||
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
||||
Name: "{group}\Editar configuracion (.env)"; Filename: "notepad.exe"; Parameters: """{app}\.env"""
|
||||
Name: "{group}\Desinstalar {#MyAppName}"; Filename: "{uninstallexe}"
|
||||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
|
||||
|
||||
[Run]
|
||||
Filename: "{app}\{#MyAppExeName}"; Description: "Ejecutar {#MyAppName} ahora"; Flags: nowait postinstall skipifsilent
|
||||
|
||||
[Code]
|
||||
// Si no existe .env, copia .env.example como .env tras instalar
|
||||
procedure CurStepChanged(CurStep: TSetupStep);
|
||||
var
|
||||
EnvFile, EnvExample: string;
|
||||
begin
|
||||
if CurStep = ssPostInstall then
|
||||
begin
|
||||
EnvFile := ExpandConstant('{app}\.env');
|
||||
EnvExample := ExpandConstant('{app}\.env.example');
|
||||
if (not FileExists(EnvFile)) and FileExists(EnvExample) then
|
||||
CopyFile(EnvExample, EnvFile, False);
|
||||
end;
|
||||
end;
|
||||
Reference in New Issue
Block a user