Files
     Фонтош Иван Сергеевич 8ec830cdb5 fiz mac build
2026-05-18 09:22:35 +08:00

75 lines
2.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Перед `electron-builder --mac`: npm ставит sharp только под CPU хоста.
* В release идут x64 и arm64 — в .app должны быть оба набора @img/sharp-darwin-*.
*/
import { execFileSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const MAC_SHARP_IMG_PACKAGES = [
'@img/sharp-darwin-arm64',
'@img/sharp-libvips-darwin-arm64',
'@img/sharp-darwin-x64',
'@img/sharp-libvips-darwin-x64',
];
/**
* @param {string} root
* @returns {string[]} entries like `@img/sharp-darwin-x64@0.34.5` missing under node_modules
*/
export function macSharpImgPackagesToInstall(root) {
const sharpPkgPath = path.join(root, 'node_modules', 'sharp', 'package.json');
if (!fs.existsSync(sharpPkgPath)) {
throw new Error('[release-mac-prep] sharp is not installed — run npm ci first');
}
const sharpPkg = JSON.parse(fs.readFileSync(sharpPkgPath, 'utf8'));
const versions = sharpPkg.optionalDependencies ?? {};
const missing = [];
for (const name of MAC_SHARP_IMG_PACKAGES) {
const version = versions[name];
if (!version) {
throw new Error(`[release-mac-prep] sharp optionalDependency missing: ${name}`);
}
if (!fs.existsSync(path.join(root, 'node_modules', name))) {
missing.push(`${name}@${version}`);
}
}
return missing;
}
/**
* @param {string} root
* @param {{ runInstall?: boolean }} [opts]
*/
export function ensureMacSharpBinaries(root, opts = {}) {
const { runInstall = true } = opts;
const toInstall = macSharpImgPackagesToInstall(root);
if (toInstall.length === 0) {
console.log('[release-mac-prep] all macOS sharp binaries present');
return;
}
console.log('[release-mac-prep] installing', toInstall.join(', '));
if (!runInstall) return;
execFileSync('npm', ['install', '--no-save', '--force', ...toInstall], {
cwd: root,
stdio: 'inherit',
});
}
const isMain = process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
if (isMain) {
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
if (process.platform !== 'darwin') {
console.warn('[release-mac-prep] skipped: not macOS (no dual-arch sharp prep needed here)');
process.exit(0);
}
ensureMacSharpBinaries(root);
}