Получение или указание имени выходного файла в electron-builder


Я работаю с electron-builder программно для создания пакетов установки. Пока у меня есть это как моя утилита для создания установочного пакета для текущего типа ОС:

const packagejson = require("../package.json");
const builder = require("electron-builder");
const Platform = builder.Platform;

function buildPromise(){
    //Development package.json
    const devMetadata  = packagejson.electronBuilder;

    //Application package.json
    const appMetadata = {
        name: packagejson.name,
        version: packagejson.version,
        description: packagejson.description,
        author: packagejson.author,
        productName: packagejson.productName
    };

    //Build for the current target and send back promise
    return builder.build({
        projectDir: "./",
        devMetadata,
        appMetadata
    });

}

module.exports = { 
    buildPromise,
    outputPath : packagejson.electronBuilder.directories.output
};

То, что он делает, это вытягивает необходимые метаданные из главного файла приложения package.json, который содержит этот раздел (поэтому приложение package.json пусто):

  ...
  "electronBuilder": {
    "build": {
      "productName": "Node App",
      "appId": "my.id",
      "asar": false,
      "win": {
        "iconUrl": "http://localhost:5000/images/logo-multi.ico",
        "target": "nsis"
      },
      "nsis" :{
        "oneClick": false
      }
    },
    "directories": {
      "output": "electron/output",
      "app":"electron/app",
      "buildResources": "electron/buildResources"
    }
  }
  ...

Когда я запускаю сборку в Windows, я получаю файл с именем Node App Setup 1.0.0.exe. Пока так идут. Но как мне на самом деле управлять этим последним именем файла? Или, по крайней мере, получить это имя файла программно, чтобы я мог прочитать его и каким-то образом ответить клиенту? Очевидно, я мог бы собрать его воедино из настроек файла json, но я бы предпочел, чтобы это было более определенно.

2 3

2 ответа:

Вы можете указать выходное имя файла, используя artifactName в разделе build Вашего package.json.

В документах говорится, что шаблон имени файла артефакта поддерживает макрос ${ext}:

Макрос

${ext} поддерживается в дополнение к файловым макросам .

Файловые Макросы

Вы можете использовать макросы в шаблонах файлов, шаблонах имен файлов артефактов и url-адресе конфигурации публикации:

${arch} - расширено до ia32, x64. Если нет арки, макрос будет удален из вашего шаблона с ведущим пространством, - и _ (таким образом, вам не нужно беспокоиться и можно повторно использовать шаблон).
${os} - расширен до mac, linux или win в соответствии с целевой платформой.
${name} – пакет.имя json.
${productName} - Санированное название продукта.
${version} - из пакета.json
${channel} - обнаружен пререлизный компонент из версии (например, бета-версия).
${env.ENV_NAME} - любая переменная окружения.
Любое свойство AppInfo (например, buildVersion, номер_сборки).

Пример

"build": {
    "appId": "com.electron.app.my",
    "artifactName": "node-app-${version}.${ext}",
    ...
},

Если ваша версия пакета 1.0.0, целевой объект Windows выведет:

node-app-1.0.0.exe

По моей просьбе автор добавил его в текущую версию (8.5.1):

Https://github.com/electron-userland/electron-builder/issues/899

Итак, теперь мы можем сделать:

builder.build()
    .then(paths => {
        //paths contains an array of export file paths, e.g.:
        console.log(paths[0]); //= c:/MyProject/dist/My Project Setup 1.0.0.exe
        console.log(paths[1]); //= c:/MyProject/dist/myproject-1.0.0-x86_64.AppImage
    });