From 4f4e0187715a57a358ab8ccfefef3fd0f8186584 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Thu, 14 Jan 2021 23:47:20 -0800 Subject: [PATCH] feat: Custom electronDist callback (#5527) * Enabling `electronDist` to be a function that returns the path to the electron dist. This is necessary for universal builds where an `electronDist` must be specified per-architecture. Updated documentation for the expected options (string path vs function) * Allow absolute path, otherwise resolve from projectDir Co-authored-by: Mike Maietta --- packages/app-builder-lib/scheme.json | 11 +++++++++-- packages/app-builder-lib/src/configuration.ts | 5 +++-- .../src/electron/ElectronFramework.ts | 19 ++++++++++--------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/app-builder-lib/scheme.json b/packages/app-builder-lib/scheme.json index 0180fa2538..4b5f9c77f4 100644 --- a/packages/app-builder-lib/scheme.json +++ b/packages/app-builder-lib/scheme.json @@ -5711,8 +5711,15 @@ "type": "boolean" }, "electronDist": { - "description": "The path to custom Electron build (e.g. `~/electron/out/R`).", - "type": "string" + "description": "Returns the path to custom Electron build (e.g. `~/electron/out/R`). Zip files must follow the pattern `electron-v${version}-${platformName}-${arch}.zip`, otherwise it will be assumed to be an unpacked Electron app directory", + "anyOf": [ + { + "typeof": "function" + }, + { + "type": "string" + } + ] }, "electronDownload": { "$ref": "#/definitions/ElectronDownloadOptions", diff --git a/packages/app-builder-lib/src/configuration.ts b/packages/app-builder-lib/src/configuration.ts index bda0d7d7d7..5502689674 100644 --- a/packages/app-builder-lib/src/configuration.ts +++ b/packages/app-builder-lib/src/configuration.ts @@ -1,6 +1,7 @@ import { Arch } from "builder-util" import { BeforeBuildContext, Target } from "./core" import { ElectronDownloadOptions } from "./electron/ElectronFramework" +import { PrepareApplicationStageDirectoryOptions } from "./Framework" import { AppXOptions } from "./options/AppXOptions" import { AppImageOptions, DebOptions, LinuxConfiguration, LinuxTargetSpecificOptions } from "./options/linuxOptions" import { DmgOptions, MacConfiguration, MasConfiguration } from "./options/macOptions" @@ -129,9 +130,9 @@ export interface Configuration extends PlatformSpecificBuildOptions { readonly electronCompile?: boolean /** - * The path to custom Electron build (e.g. `~/electron/out/R`). + * Returns the path to custom Electron build (e.g. `~/electron/out/R`). Zip files must follow the pattern `electron-v${version}-${platformName}-${arch}.zip`, otherwise it will be assumed to be an unpacked Electron app directory */ - readonly electronDist?: string + readonly electronDist?: string | ((options: PrepareApplicationStageDirectoryOptions) => string) /** * The [electron-download](https://github.com/electron-userland/electron-download#usage) options. diff --git a/packages/app-builder-lib/src/electron/ElectronFramework.ts b/packages/app-builder-lib/src/electron/ElectronFramework.ts index 162fa21d6f..c560312da3 100644 --- a/packages/app-builder-lib/src/electron/ElectronFramework.ts +++ b/packages/app-builder-lib/src/electron/ElectronFramework.ts @@ -143,14 +143,15 @@ export async function createElectronFrameworkSupport(configuration: Configuratio } async function unpack(prepareOptions: PrepareApplicationStageDirectoryOptions, options: ElectronDownloadOptions, distMacOsAppName: string) { - const packager = prepareOptions.packager - const out = prepareOptions.appOutDir + const { packager, appOutDir, platformName } = prepareOptions - let dist: string | null | undefined = packager.config.electronDist + const electronDist = packager.config.electronDist + let dist: string | undefined | null = (typeof electronDist === 'function') ? electronDist(prepareOptions) : electronDist if (dist != null) { - const zipFile = `electron-v${options.version}-${prepareOptions.platformName}-${options.arch}.zip` - const resolvedDist = path.resolve(packager.projectDir, dist) + const zipFile = `electron-v${options.version}-${platformName}-${options.arch}.zip` + const resolvedDist = path.isAbsolute(dist) ? dist : path.resolve(packager.projectDir, dist) if ((await statOrNull(path.join(resolvedDist, zipFile))) != null) { + log.debug({ resolvedDist, zipFile }, "Resolved electronDist") options.cache = resolvedDist dist = null } @@ -161,15 +162,15 @@ async function unpack(prepareOptions: PrepareApplicationStageDirectoryOptions, o if (isSafeToUnpackElectronOnRemoteBuildServer(packager)) { return } - - await executeAppBuilder(["unpack-electron", "--configuration", JSON.stringify([options]), "--output", out, "--distMacOsAppName", distMacOsAppName]) + log.info({ zipPath: options.cache }, "Unpacking electron zip") + await executeAppBuilder(["unpack-electron", "--configuration", JSON.stringify([options]), "--output", appOutDir, "--distMacOsAppName", distMacOsAppName]) } else { isFullCleanup = true const source = packager.getElectronSrcDir(dist) - const destination = packager.getElectronDestinationDir(out) + const destination = packager.getElectronDestinationDir(appOutDir) log.info({source, destination}, "copying Electron") - await emptyDir(out) + await emptyDir(appOutDir) await copyDir(source, destination, { isUseHardLink: DO_NOT_USE_HARD_LINKS, })