test(rn-update): run real Hermes compiler on Windows
这个提交包含在:
父节点
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 {
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户