test(rn-update): run real Hermes compiler on Windows

这个提交包含在:
XuqmGroup 2026-07-18 07:08:18 +08:00
父节点 aacfbf0edd
当前提交 04fc964a92

查看文件

@ -1,12 +1,22 @@
import assert from 'node:assert/strict' import assert from 'node:assert/strict'
import { execFileSync } from 'node:child_process' import { execFileSync } from 'node:child_process'
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import {
chmodSync,
copyFileSync,
mkdirSync,
mkdtempSync,
readFileSync,
rmSync,
writeFileSync,
} from 'node:fs'
import { createRequire } from 'node:module'
import { tmpdir } from 'node:os' import { tmpdir } from 'node:os'
import path from 'node:path' import path from 'node:path'
import test from 'node:test' import test from 'node:test'
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
const cli = fileURLToPath(new URL('./xuqm-rn.mjs', import.meta.url)) const cli = fileURLToPath(new URL('./xuqm-rn.mjs', import.meta.url))
const workspaceRequire = createRequire(import.meta.url)
test('embed creates a complete versioned manifest from a host fixture', () => { test('embed creates a complete versioned manifest from a host fixture', () => {
const root = mkdtempSync(path.join(tmpdir(), 'xuqm-cli-')) const root = mkdtempSync(path.join(tmpdir(), 'xuqm-cli-'))
@ -139,25 +149,34 @@ test('Android Hermes hosts compile plugin bundles to bytecode', () => {
: 'linux64-bin', : 'linux64-bin',
process.platform === 'win32' ? 'hermesc.exe' : 'hermesc', process.platform === 'win32' ? 'hermesc.exe' : 'hermesc',
) )
writeFileSync( // 使用当前 React Native 实际依赖的 Hermes 编译器。文本脚本即使命名为
compiler, // hermesc.exe 也不是 Windows 可执行文件,会让 CI 只验证到测试替身而非真实链路。
`#!/usr/bin/env node const workspaceReactNativeManifest = workspaceRequire.resolve('react-native/package.json')
const fs = require('node:fs'); const workspaceReactNativeRequire = createRequire(workspaceReactNativeManifest)
const args = process.argv.slice(2); const workspaceCompilerManifest = workspaceReactNativeRequire.resolve(
fs.writeFileSync(args[args.indexOf('-out') + 1], 'hermes-bytecode'); 'hermes-compiler/package.json',
`,
{ mode: 0o755 },
) )
const workspaceCompiler = path.join(
path.dirname(workspaceCompilerManifest),
'hermesc',
process.platform === 'win32'
? 'win64-bin'
: process.platform === 'darwin'
? 'osx-bin'
: 'linux64-bin',
process.platform === 'win32' ? 'hermesc.exe' : 'hermesc',
)
copyFileSync(workspaceCompiler, compiler)
if (process.platform !== 'win32') chmodSync(compiler, 0o755)
execFileSync(process.execPath, [cli, 'embed', 'android'], { execFileSync(process.execPath, [cli, 'embed', 'android'], {
cwd: root, cwd: root,
stdio: 'pipe', stdio: 'pipe',
}) })
assert.equal( const bytecode = readFileSync(path.join(root, 'generated', 'common.android.bundle'))
readFileSync(path.join(root, 'generated', 'common.android.bundle'), 'utf8'), assert.ok(bytecode.length > Buffer.byteLength('javascript'))
'hermes-bytecode', assert.notEqual(bytecode.toString('utf8'), 'javascript')
)
const manifest = JSON.parse(readFileSync(path.join(root, 'generated', 'manifest.json'), 'utf8')) const manifest = JSON.parse(readFileSync(path.join(root, 'generated', 'manifest.json'), 'utf8'))
assert.equal(manifest.bundleFormat, 'hermes-bytecode') assert.equal(manifest.bundleFormat, 'hermes-bytecode')
} finally { } finally {