web-dev-qa-db-fra.com

Comment empaqueter une application Electron dans un seul exécutable?

En utilisant électron-packager, je peux créer une version "packagée" de mon application JavaScript pour diverses architectures et plates-formes. Cependant, il ne regroupe pas chaque build comme un seul binaire que je peux distribuer.

En cherchant des alternatives, j'ai découvert EncloseJs , mais ce n'est pas gratuit (et je préfère une solution gratuite).

Un autre que j'ai trouvé était électron-passe-partout , qui ne crée qu'un * .deb, * .app ou un programme d'installation Windows, mais pas un seul exécutable qui exécutera le programme.

Est-il possible d'utiliser Electron pour créer un seul fichier exécutable?

12
Kees

Pas vraiment, mais ça va.

Je doute qu'il existe de nombreuses applications de bureau composées uniquement d'un exécutable. En règle générale, vous aurez beaucoup de fichiers de ressources. Electron est identique: il est livré avec un fichier "exécutable unique" qui démarre Electron et de nombreux fichiers supplémentaires. Lorsque vous utilisez électron-packager, vous obtenez un seul exécutable qui démarre votre application, mais il est fourni avec de nombreux fichiers de ressources (comme votre code Javascript). Je suppose que vous pouvez essayer d'utiliser une sorte de bin packer pour tout regrouper en un seul binaire, mais pourquoi voulez-vous faire cela? La plupart des applications se composent de nombreux fichiers et dossiers et n'ont aucun problème avec cela.

0
inukshuk

yup, c'est (maintenant) possible. Choisissez l'un des modules pour générer un seul fichier exe: électron-constructeur , électron-forge ou windows-installer .

9
JerryGoyal

Essayez d'utiliser electron-builder -p --win. il créera le .exe prêt pour la production. Je l'ai fait avec [email protected]

pour la version publiable, vous aurez besoin du fournisseur de publication dans votre fichier package.json, considérez l'exemple donné.

"build": {
    "appId": "com.trinityinfosystem.electron.exchange.stream",
    "productName": "Accurate",
    "copyright": "Copyright © 2018 Trinity InfoSystem",
    "mac": {
      "category": "public.app-category.utilities",
      "icon": "assets/icon.icns",
      "target": [
        "Zip",
        "dmg"
      ],
      "publish": [
        "github"
      ]
    },
    "win": {
      "publisherName": "Trinity InfoSystem",
      "publish": [
        "github"
      ],
      "target": [
        "nsis"
      ]
    },
    "linux": {
      "target": [
        "AppImage",
        "tar.gz"
      ]
    },
    "dmg": {
      "background": "assets/background.png",
      "icon": "assets/icon.icns",
      "title": "Accurate Installer"
    },
    "nsis": {
      "oneClick": false,
      "perMachine": false,
      "allowToChangeInstallationDirectory": true,
      "installerIcon": "assets/icon.ico",
      "installerSidebar": "assets/sidebar.bmp",
      "uninstallerSidebar": "assets/sidebar.bmp",
      "license": "assets/agreement.html",
      "createDesktopShortcut": true,
      "createStartMenuShortcut": true
    },
    "publish": [
      {
        "provider": "github",
        "owner": "vkiranmaniya",
        "repo": "accurate",
        "vPrefixedTagName": true,
        "private": true,
        "releaseType": "draft"
      }
    ]
  },

Ajoutez la configuration de pulishing donnée à votre package.json en tant que propriété racine. Vous aurez besoin du jeton d'accès personnel Github (voici le Doc ) pour être exporté lors de l'exécution d'une build.

Vous pouvez exporter le jeton en tant que variable env à partir de main.js Comme indiqué,

process.env.GH_TOKEN = 'YOUR_PERSONAL_ACCESS_TOKEN_HERE';

Si vous souhaitez configurer AutoUpdate à l'aide de GitHub, vous pouvez utiliser le module donné et appeler la méthode checkForUpdates()from main.js

const electron = require("electron");
const updater = require("electron-updater");
const autoUpdater = updater.autoUpdater;

autoUpdater.on('checking-for-update', function () {
    sendStatusToWindow('Checking for update...');
});

autoUpdater.on('update-available', function (info) {
    sendStatusToWindow('Update available.');
});

autoUpdater.on('update-not-available', function (info) {
    sendStatusToWindow('Update not available.');
});

autoUpdater.on('error', function (err) {
    sendStatusToWindow('Error in auto-updater.');
});

autoUpdater.on('download-progress', function (progressObj) {
    let log_message = "Download speed: " + progressObj.bytesPerSecond;
    log_message = log_message + ' - Downloaded ' + parseInt(progressObj.percent) + '%';
    log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')';
    sendStatusToWindow(log_message);
});

autoUpdater.on('update-downloaded', function (info) {
    sendStatusToWindow('Update downloaded; will install in 1 seconds');
});

autoUpdater.on('update-downloaded', function (info) {
    setTimeout(function () {
        autoUpdater.quitAndInstall();
    }, 1000);
});

function checkForUpdates(){
    const data = {
        'provider': 'github',
        'owner':    'vkiranmaniya',
        'repo':     'exchange',
        'token':    'YOUR_PERSONAL_TOKEN_HERE'
      };
    autoUpdater.setFeedURL(data);
    autoUpdater.checkForUpdates();
}

function sendStatusToWindow(message) {
    console.log(message);
}

module.exports = {
    checkForUpdates,
}

Vous pouvez maintenant exécuter la commande electron-build -p --win Pour créer un fichier .exe autonome pouvant être mis à jour automatiquement. Utilisez --mac Ou --linux Pour cibler une plate-forme spécifique pour la construction.

6
Kiran Maniya

Je ne sais pas s'il existe une solution plus récente, mais vous pouvez utiliser BoxedApp , vous avez dû l'acheter mais vous pouvez rechercher une version gratuite.

Vous pouvez également utiliser WinRAR , votre projet sera emballé dans un seul exe en créant une archive SFX. Voici une vidéo sur Comment faire une application portable en utilisant WinRAR .

CONS: le lancement de l'application prendra plus de temps.

REMARQUE: Vous devez d'abord emballer votre projet avant d'utiliser l'une des méthodes ci-dessus.

PS: Testé sur Windows uniquement.

J'espère que cette aide.

1
Polar