Installer et packager des électrons (partie 2)

Retour !

Lors de ma dernière tentative, j’étais resté sur ma faim car je n’arrivais pas à builder le setup Windows sous Linux. De plus, je n’avais pas géré les mises à jour qui sont normalement une fonctionnalité de base d’Electron… Donc retour !

Remonter le fil !

LaunchFox

En me baladant sur les internets, j’étais tombé sur ce site LaunchFox. Sans creuser d’avantages, je m’étais noté de regarder car le projet toolkit + la possibilité de publication me tentait bien. Bon après quelques lectures du site, je me suis rendu compte que ce n’était pas encore en production … Par contre, cela m’a permis de regarder electron-toolkit.

Electron-toolkit

Il s’agit d’une application Electron dont le but semble d’aider dans la partie build ce qui est une bonne idée. Malheureusement après quelques tests, je me suis rendu compte que l’application était limitée pour le moment :

  • Pas de logs en cas d’erreur,
  • Conserve bien les paramètres dans le package.json mais ne s’en ressert pas …
    • Par contre, la documentation indique que le projet utilise electron-builder qui semble être un concurrent de electron-packager et que j’avais déjà croisé au moment de ma première tentative.

      Je n’avais pas creusé car je trouvais la documentation pas claire et complexe comparée à electron-packager …

      AutoUpdate

      Documentation officielle

      Après cette première piste, je suis revenu à l’auto-update en partant de la documentation officielle. Pour le coup, la documentation est assez clair. Plusieurs solutions sont proposées mais elles ont toutes un point commun (sauf erreur de ma part) : il faut un serveur applicatif ou un compte GitHub.

      Dans mon cas, la deuxième n’est pas envisageable et la deuxième m’embête un peu … et c’est là que suis tombé sur ce projet electron-simple-updater. La promesse : il suffit d’un fichier placé sur un espace pour que les mises à jour fonctionnent. Et cela m’arrangerait bien.

      Et devinez avec qui il est en relation : electron-builder ! Bref, faut que j’y passe !

      Electron-Builder

      Installation

      Comme d’habitude : npm install electron-builder --save-dev

      Configuration

      Après quelques tâtonnements, je suis parvenu à cette configuration :

      
          "build": {
              "appId": "[APP_ID]"
              , "copyright": "Moi@2018
              , "productName": "productName"
              , "asar": true
              ,"appImage": {
                  "systemIntegration": "doNotAsk"
              },
              "files": [
                  "!publisher.json",
                  "!README.md",
                  "!updates.json",
                  "!release-builds/**/*"
              ],
              "linux": {
                  "category": "Utils"
              },
              "win": {
                  "target": "squirrel"
              },
              "squirrelWindows": {
                  "iconUrl": "[URL]"
              }
      

      En fait, en prenant le temps, la documentation plus les projets exemples permettent de s’en sortir.

      Build

      La commande est simple "dist":"./node_modules/.bin/electron-builder -lw" . Par défaut, il ne réalise l’action que pour la plateforme utilisée. Il faut penser à ajouter -w (windows) ou -m (mac) si on est sous linux. Dans mon cas, cela donne -lw (linux + windows).

      Alors forcément, c’est là que les ennuis commencent … Enfin pour Windows car Linux, aucun souci ! Et finalement, je suis retombé sur le même problème que la dernière fois: il manque des dépendances …

      PAF dans la gueule !

      J’ai continué à lire la documentation et je suis tombé sur cette page : ici. Et là: PAF dans la gueule ! DOCKER !!! Mais oui bien sûr. Je l’utilise tous les jours et en plus ici, ils fournissent des images.

      Souci de timezone

      Avec la commande fournie, j’ai quand même un souci : Could not find file "/etc/localtime". Il s’agit d’un bug connu de mono (nécessaire pour le build pour Windows) mais qui n’est pas corrigé dans la version de l’image fournie. Pas grave, il suffit de changer la commande en ajoutant un paramètre :

      
      docker run --rm -ti  --env-file <(env | grep -iE 'DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS_TAG|TRAVIS|TRAVIS_REPO_|TRAVIS_BUILD_|TRAVIS_BRANCH|TRAVIS_PULL_REQUEST_|APPVEYOR_|CSC_|GH_|GITHUB_|BT_|AWS_|STRIP|BUILD_')  --env ELECTRON_CACHE="/root/.cache/electron"  --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder"  -v ${PWD}:/project  -v ${PWD##*/}-node-modules:/project/node_modules  -v ~/.cache/electron:/root/.cache/electron  -v ~/.cache/electron-builder:/root/.cache/electron-builder -v /etc/localtime:/etc/localtime electronuserland/builder:wine-mono /bin/bash -c "npm run dist"
      

      Le build fonctionne mais …

      Mais pas l’installer : « This a dummy update.exe […] ». Qwant n’étant pas si mal que cela, j’ai trouvé UNE information mais c’était la bonne. Il fallait nettoyer le répertoire nodes_modules : et pour le coup ça marche !

      Electron-simple-updater

      Alors en fait

      Je vais commencer par un autre package : electron-simple-publisher. Ce package doit permettre de publier et mettre à jour le fichier de release qui est utilisé par electron-simple-updated.

      Vous reprendrez bien du NPM

      npm install --save-dev electron-simple-publisher

      Configuration

      Ayant un FTP sous la main, je vais l’utiliser. J’ai crée (comme demandé), un fichier publisher.json reprennant l’exemple ici.

      La commande

      node_modules/.bin/publish all

      Le all est présent car défaut, il ne publie que celui de la plateforme en cours (c’est un peu une manie).

      Modification

      On fait comme il demande :

      
      // [...]
      const updater = require('electron-simple-updater
      // [...]
      // Gestion de la mise à jour
      updater.init();
      

      Le chemin vers le fichier update.json (qui gère les versions) est directement dans le package.json.

      Test !

      Et bien çà marche !

      Le test :

      • Installation de la version 1.0.1 manuellement sur un poste Windows,
      • Génération et publication de la version 1.0.2,
      • Relance de l’application –> constat que la version 1.0.2 est bien là
      • Relance de l’application –> c’est la version 1.0.2.

      Suite ?

      Il faut que je trouve un moyen d’éviter les relances …

      Bilan

      Je builde et publie depuis Linux une application Electron qui tourne sous Windows ! Bref, ça marche !

      D’ailleurs pour une fois, j’ai presque pas eu de soucis entre la documentation et l’action. Cela explique peut-être le résultat 🙂