Installer et packager des électrons !

Introduction

Après une nouvelle période d’absence (été, projets), je reprends les jours R&D pour la rentrée ! Premier sujet de cette nouvelle: générer un installeur windows pour une application Electron.

Premiers pas

Electron Installer

Après une rapide recherche, je suis tombé sur plusieurs articles qui pointaient vers le même projet : electron-winstaller donc je pense que je vais regarder par là. Première chose : le projet utilise Squirrel. Mais c’est quoi donc Squirrel ?

Squirrel

Le titre du projet est assez évocateur : « Squirrel, It’s like ClickOne but Works » … Le but est de créer des installeur pour windows (IOs aussi). Le projet et sa documentation cible très clairement les applications .Net et utilise le système de package associé « NuGet ». Le système propose des mécanismes de mises à jour en arrière plan ce qui peut-être pratique !

J’essaye !

Package

Le projet utilisé pour test est une reprise et j’avais oublié qu’il n’avait pas de package … donc il faut commencer par remettre en place la possibilité de packager car c’est un prérequis

  • Installation du packager: npm install -g electron-packager,
  • Version Linux : electron-packager . teamweather --platform=linux --arch=x64 --out=release-builds --prune=true --overwrite
  • Version Windows : electron-packager . teamweather --platform=win32 --arch=x64 --out=release-builds --prune=true --overwrite

Le package ne pose aucun souci … pas une erreur rien. C’est louche mais ca marche

Installer

Script

La documentation décrit le code qu’il faut utiliser. Personnellement, j’ai suivi le conseil d’un des articles et j’ai externalisé le code dans une commande. Voici le code (qui est très proche de celui présent dans les articles …) :


// Dépendandes
const createWindowsInstaller = require('electron-winstaller').createWindowsInstaller
const path = require('path')

// Appel de la fonction
getInstallerConfig()
  .then(createWindowsInstaller)
  .catch((error) => {
    console.error(error.message || error)
    process.exit(1)
  })

  // La fonction de build
function getInstallerConfig () {
  // un petit log
  console.log('creating windows installer')
  // Point de départ
  const rootPath = path.join('./')
  // Sortie
  const outPath = path.join(rootPath, 'release-builds')

  // Action !!!
  return Promise.resolve({
    appDirectory: path.join(outPath, 'teamweather-win32-x64/'), // Là où est la version packagé
    authors: 'TeamWeather Team', // L'auteur
    noMsi: true,
    outputDirectory: path.join(outPath, 'windows-installer'), // Là où sera déposé le package
    exe: 'teamweather.exe', // l'exec
    setupExe: 'TeamWeatherAppInstaller.exe' // le nom du setup
  })
}

Pour builder, il suffit alors de lancer la commande : node installers/windows/createinstaller.js

Build

Alors ... comment dire que j'ai galéré. En même temps, c'est ma faute : j'étais sous Linux pour un installer Windows. J'ai essayé d'installer des éléments manquants (Mono) mais c'était jamais la bonne version ou je prennais le risque de casser ma distrib. Totale, je suis passer sous Windows et 5 minutes c'était réglé ... :

npm install --save-dev electron-winstaller
node installers/windows/createinstaller.js

Voilà !

Actions avant / après

Comme indiqué dans la documentation, il est possible de réaliser des commandes en mode "installation/désinstallation". Par exemple, après l'installation, enregistrer une clé de registre. Je n'ai pas eu le temps de pousser cette partie en raison des soucis de build mais le principe est assez simple

.

Suite à une action "setup", l'executable principale est appelée avec un paramètre du type '--squirrel-install'. Il faut donc détecter le paramètre et réaliser les actions que l'on souhaite en fonction du paramètre. Voici deux exemples :


case '--squirrel-install':
case '--squirrel-updated':
                // Ajout d'un raccourci
                spawnUpdate(['--createShortcut', exeName]);
                setTimeout(app.quit, 1000);
                return true;
case '--squirrel-uninstall':
                // Suppression du raccourci
                spawnUpdate(['--removeShortcut', exeName]);
                setTimeout(app.quit, 1000);
                return true;

Un point important : il faut que les traitements soient rapides ! En effet, Squirrel car couper l'application au bout d'une seconde ... Pas le temps de traîner !

Bilan

J'ai bien un installer mais j'ai pu regarder les mises à jour ... J'aurais pas du insister à vouloir builder un package windows sous linux ... Ce sera pour un autre demain.

Liens

Quelques liens :