This commit introduces a universal binary format in the distributed MDG files for macOS, improving support for both Apple Silicon (ARM) and Intel (x64) architectures. It uses `electron-builder` to package both architectures into a single executable, ensuring the application can natively on any macOS hardware without depending on the GitHub runners' architecture. It fixes the issue related to prior releases that supported only the architecture of the build environment itself, which is subject to change. Changes: - Update DMG distribution to include both ARM64 and x64 architectures. - Enhance system requirements documentation to reflect support for both architectures. - Modify CI/CD workflows to check desktop runtime errors for both ARM64 and x64 versions on macOS. Resolves: - Issue #348: Initial request for Apple Silicon support. - Issue #362: Correction of distribution limited to ARM64 in release 0.13.3. `electron-builder` support: - electron-userland/electron-builder#5475 - electron-userland/electron-builder#5689 - electron-userland/electron-builder#5426
75 lines
1.9 KiB
JavaScript
75 lines
1.9 KiB
JavaScript
/* eslint-disable no-template-curly-in-string */
|
|
|
|
const { join, resolve } = require('node:path');
|
|
const { readdirSync, existsSync } = require('node:fs');
|
|
const { electronBundled, electronUnbundled } = require('./dist-dirs.json');
|
|
|
|
/**
|
|
* @type {import('electron-builder').Configuration}
|
|
* @see https://www.electron.build/configuration/configuration
|
|
*/
|
|
module.exports = {
|
|
// Common options
|
|
publish: {
|
|
provider: 'github',
|
|
vPrefixedTagName: false, // default: true
|
|
releaseType: 'release', // default: draft
|
|
},
|
|
directories: {
|
|
output: electronBundled,
|
|
buildResources: resolvePathFromProjectRoot('src/presentation/electron/build'),
|
|
},
|
|
extraMetadata: {
|
|
main: findMainEntryFile(
|
|
join(electronUnbundled, 'main'), // do not `path.resolve`, it expects a relative path
|
|
),
|
|
},
|
|
|
|
// Windows
|
|
win: {
|
|
target: 'nsis',
|
|
},
|
|
nsis: {
|
|
artifactName: '${name}-Setup-${version}.${ext}',
|
|
},
|
|
|
|
// Linux
|
|
linux: {
|
|
target: 'AppImage',
|
|
},
|
|
appImage: {
|
|
artifactName: '${name}-${version}.${ext}',
|
|
},
|
|
|
|
// macOS
|
|
mac: {
|
|
target: {
|
|
target: 'dmg',
|
|
arch: 'universal',
|
|
},
|
|
},
|
|
dmg: {
|
|
artifactName: '${name}-${version}.${ext}',
|
|
},
|
|
};
|
|
|
|
/**
|
|
* Finds by accommodating different JS file extensions and module formats.
|
|
*/
|
|
function findMainEntryFile(parentDirectory) {
|
|
const absoluteParentDirectory = resolvePathFromProjectRoot(parentDirectory);
|
|
if (!existsSync(absoluteParentDirectory)) {
|
|
return null; // Avoid disrupting other processes such `npm install`.
|
|
}
|
|
const files = readdirSync(absoluteParentDirectory);
|
|
const entryFile = files.find((file) => /^index\.(cjs|mjs|js)$/.test(file));
|
|
if (!entryFile) {
|
|
throw new Error(`Main entry file not found in ${absoluteParentDirectory}.`);
|
|
}
|
|
return join(parentDirectory, entryFile);
|
|
}
|
|
|
|
function resolvePathFromProjectRoot(pathSegment) {
|
|
return resolve(__dirname, pathSegment);
|
|
}
|