Merge branch 'codex/portal-resvg-linux-arm64'
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
import fs from 'node:fs/promises';
|
import fs from 'node:fs/promises';
|
||||||
|
import os from 'node:os';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { fileURLToPath } from 'node:url';
|
import { fileURLToPath } from 'node:url';
|
||||||
import { spawn } from 'node:child_process';
|
import { spawn } from 'node:child_process';
|
||||||
@@ -16,6 +17,7 @@ const skipBuild = process.argv.includes('--skip-build');
|
|||||||
const skipNodeModules = process.argv.includes('--skip-node-modules');
|
const skipNodeModules = process.argv.includes('--skip-node-modules');
|
||||||
const runtimeNodeTarget = process.env.PORTAL_RUNTIME_NODE_TARGET || 'node24';
|
const runtimeNodeTarget = process.env.PORTAL_RUNTIME_NODE_TARGET || 'node24';
|
||||||
const runtimeInstallMode = process.env.PORTAL_RUNTIME_INSTALL_MODE || 'bundle-node-modules';
|
const runtimeInstallMode = process.env.PORTAL_RUNTIME_INSTALL_MODE || 'bundle-node-modules';
|
||||||
|
const linuxArm64ResvgPackage = '@resvg/resvg-js-linux-arm64-gnu';
|
||||||
|
|
||||||
const externalPackages = [
|
const externalPackages = [
|
||||||
'@img/sharp-darwin-arm64',
|
'@img/sharp-darwin-arm64',
|
||||||
@@ -195,6 +197,39 @@ async function copyNodeModules() {
|
|||||||
console.log('==> 拷贝生产运行依赖 node_modules');
|
console.log('==> 拷贝生产运行依赖 node_modules');
|
||||||
await copyDir(resolvedNodeModulesDir, path.join(runtimeRoot, 'node_modules'));
|
await copyDir(resolvedNodeModulesDir, path.join(runtimeRoot, 'node_modules'));
|
||||||
await rewriteNodeModulesSymlinks(path.join(runtimeRoot, 'node_modules'), resolvedNodeModulesDir);
|
await rewriteNodeModulesSymlinks(path.join(runtimeRoot, 'node_modules'), resolvedNodeModulesDir);
|
||||||
|
await installLinuxArm64ResvgBinary();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The runtime artifact is assembled on macOS but runs in a Linux ARM64 Colima VM.
|
||||||
|
// pnpm therefore copies the macOS optional resvg binary only. Keep the target
|
||||||
|
// native package alongside the copied node_modules so the dynamic require in
|
||||||
|
// @resvg/resvg-js resolves in production.
|
||||||
|
async function installLinuxArm64ResvgBinary() {
|
||||||
|
const resvgPackageJson = JSON.parse(
|
||||||
|
await fs.readFile(path.join(nodeModulesDir, '@resvg', 'resvg-js', 'package.json'), 'utf8'),
|
||||||
|
);
|
||||||
|
const version = resvgPackageJson.optionalDependencies?.[linuxArm64ResvgPackage];
|
||||||
|
if (!version) {
|
||||||
|
throw new Error(`无法确定 ${linuxArm64ResvgPackage} 的版本`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const stagingDir = await fs.mkdtemp(path.join(os.tmpdir(), 'memind-resvg-linux-arm64-'));
|
||||||
|
const targetDir = path.join(runtimeRoot, 'node_modules', '@resvg', 'resvg-js-linux-arm64-gnu');
|
||||||
|
try {
|
||||||
|
console.log(`==> 补齐 Linux ARM64 resvg 原生依赖 (${version})`);
|
||||||
|
await run('npm', ['pack', `${linuxArm64ResvgPackage}@${version}`, '--pack-destination', stagingDir]);
|
||||||
|
const archive = (await fs.readdir(stagingDir)).find((name) => name.endsWith('.tgz'));
|
||||||
|
if (!archive) throw new Error(`未生成 ${linuxArm64ResvgPackage} 安装包`);
|
||||||
|
await remove(targetDir);
|
||||||
|
await fs.mkdir(targetDir, { recursive: true });
|
||||||
|
await run('tar', ['-xzf', path.join(stagingDir, archive), '--strip-components=1', '-C', targetDir]);
|
||||||
|
const files = await fs.readdir(targetDir);
|
||||||
|
if (!files.some((name) => name.endsWith('.node'))) {
|
||||||
|
throw new Error(`${linuxArm64ResvgPackage} 缺少原生 .node 文件`);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
await remove(stagingDir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function rewriteNodeModulesSymlinks(runtimeNodeModulesDir, sourceNodeModulesDir) {
|
async function rewriteNodeModulesSymlinks(runtimeNodeModulesDir, sourceNodeModulesDir) {
|
||||||
|
|||||||
Reference in New Issue
Block a user