使用Lerna 和 monorepo管理项目结构

This commit is contained in:
YHH
2025-08-07 13:29:12 +08:00
parent 4479f0fab0
commit ea8523be35
135 changed files with 7058 additions and 372 deletions

View File

@@ -1,125 +0,0 @@
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
console.log('🚀 使用 Rollup 构建npm包...');
async function main() {
try {
// 清理旧的dist目录
if (fs.existsSync('./dist')) {
console.log('🧹 清理旧的构建文件...');
execSync('rimraf ./dist', { stdio: 'inherit' });
}
// 执行Rollup构建
console.log('📦 执行 Rollup 构建...');
execSync('rollup -c', { stdio: 'inherit' });
// 生成package.json
console.log('📋 生成 package.json...');
generatePackageJson();
// 复制其他文件
console.log('📁 复制必要文件...');
copyFiles();
// 输出构建结果
showBuildResults();
console.log('✅ 构建完成!');
console.log('\n🚀 发布命令:');
console.log('cd dist && npm publish');
} catch (error) {
console.error('❌ 构建失败:', error.message);
process.exit(1);
}
}
function generatePackageJson() {
const sourcePackage = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
const distPackage = {
name: sourcePackage.name,
version: sourcePackage.version,
description: sourcePackage.description,
main: 'index.cjs',
module: 'index.mjs',
types: 'index.d.ts',
exports: {
'.': {
import: './index.mjs',
require: './index.cjs',
types: './index.d.ts'
}
},
files: [
'index.mjs',
'index.mjs.map',
'index.cjs',
'index.cjs.map',
'index.d.ts',
'README.md',
'LICENSE',
'SECURITY.md',
'COCOS_USAGE.md',
'.npmignore'
],
keywords: [
'ecs',
'entity-component-system',
'game-engine',
'typescript',
'cocos-creator',
'laya',
'rollup'
],
author: sourcePackage.author,
license: sourcePackage.license,
repository: sourcePackage.repository,
bugs: sourcePackage.bugs,
homepage: sourcePackage.homepage,
engines: {
node: '>=16.0.0'
},
sideEffects: false
};
fs.writeFileSync('./dist/package.json', JSON.stringify(distPackage, null, 2));
}
function copyFiles() {
const filesToCopy = [
{ src: './README.md', dest: './dist/README.md' },
{ src: './LICENSE', dest: './dist/LICENSE' },
{ src: './SECURITY.md', dest: './dist/SECURITY.md' },
{ src: './COCOS_USAGE.md', dest: './dist/COCOS_USAGE.md' },
{ src: './.npmignore', dest: './dist/.npmignore' }
];
filesToCopy.forEach(({ src, dest }) => {
if (fs.existsSync(src)) {
fs.copyFileSync(src, dest);
console.log(` ✓ 复制: ${path.basename(dest)}`);
} else {
console.log(` ⚠️ 文件不存在: ${src}`);
}
});
}
function showBuildResults() {
const distDir = './dist';
const files = ['index.mjs', 'index.cjs', 'index.d.ts'];
console.log('\n📊 构建结果:');
files.forEach(file => {
const filePath = path.join(distDir, file);
if (fs.existsSync(filePath)) {
const size = fs.statSync(filePath).size;
console.log(` ${file}: ${(size / 1024).toFixed(1)}KB`);
}
});
}
main().catch(console.error);

View File

@@ -0,0 +1,108 @@
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
console.log('发布前检查...');
async function main() {
try {
// 1. 检查所有包的package.json是否存在
console.log('\n检查包结构...');
const packagesDir = path.join(__dirname, '..', 'packages');
const packages = fs.readdirSync(packagesDir);
for (const pkg of packages) {
const pkgPath = path.join(packagesDir, pkg);
const packageJsonPath = path.join(pkgPath, 'package.json');
if (!fs.existsSync(packageJsonPath)) {
throw new Error(`${pkg} 缺少 package.json`);
}
console.log(` [OK] ${pkg}: package.json 存在`);
}
// 2. 检查构建输出是否存在
console.log('\n检查构建输出...');
for (const pkg of packages) {
const pkgPath = path.join(packagesDir, pkg);
const binPath = path.join(pkgPath, 'bin');
if (!fs.existsSync(binPath)) {
throw new Error(`${pkg} 缺少构建输出 (bin目录不存在)`);
}
const indexPath = path.join(binPath, 'index.js');
if (!fs.existsSync(indexPath)) {
throw new Error(`${pkg} 缺少入口文件 (bin/index.js 不存在)`);
}
console.log(` [OK] ${pkg}: 构建输出存在`);
}
// 3. 检查版本依赖一致性
console.log('\n检查依赖版本...');
const corePackageJson = JSON.parse(fs.readFileSync(
path.join(packagesDir, 'core', 'package.json'),
'utf8'
));
const networkPackageJson = JSON.parse(fs.readFileSync(
path.join(packagesDir, 'network', 'package.json'),
'utf8'
));
const coreVersion = corePackageJson.version;
const networkPeerDep = networkPackageJson.peerDependencies['@esengine/ecs-framework'];
console.log(` Core版本: ${coreVersion}`);
console.log(` Network依赖: ${networkPeerDep}`);
// 检查network的peerDependencies是否兼容core的当前版本
const semver = require('semver');
if (!semver.satisfies(coreVersion, networkPeerDep)) {
console.warn(` [WARN] 版本可能不兼容,但继续检查...`);
} else {
console.log(` [OK] 版本兼容性检查通过`);
}
// 4. 检查Git状态
console.log('\n检查Git状态...');
try {
const gitStatus = execSync('git status --porcelain', { encoding: 'utf8' });
if (gitStatus.trim()) {
console.warn(' [WARN] 工作目录有未提交的更改:');
console.warn(gitStatus);
} else {
console.log(' [OK] 工作目录干净');
}
} catch (error) {
console.warn(' [WARN] 无法检查Git状态');
}
// 5. 运行测试
console.log('\n运行测试...');
try {
execSync('npm test', { stdio: 'inherit', cwd: path.join(packagesDir, 'core') });
console.log(' [OK] Core包测试通过');
} catch (error) {
console.warn(' [WARN] Core包测试失败请检查');
}
try {
execSync('npm test', { stdio: 'inherit', cwd: path.join(packagesDir, 'network') });
console.log(' [OK] Network包测试通过');
} catch (error) {
console.warn(' [WARN] Network包测试失败请检查');
}
console.log('\n发布前检查完成');
console.log('\n可以运行以下命令进行发布:');
console.log('npm run publish:all');
} catch (error) {
console.error('\n发布前检查失败:', error.message);
process.exit(1);
}
}
main().catch(console.error);

33
scripts/sync-versions.cjs Normal file
View File

@@ -0,0 +1,33 @@
const fs = require('fs');
const path = require('path');
console.log('同步包版本...');
function updateNetworkPeerDependency() {
try {
// 读取core包版本
const corePackageJsonPath = path.join(__dirname, '..', 'packages', 'core', 'package.json');
const corePackageJson = JSON.parse(fs.readFileSync(corePackageJsonPath, 'utf8'));
const coreVersion = corePackageJson.version;
console.log(`Core版本: ${coreVersion}`);
// 更新network包的peerDependencies
const networkPackageJsonPath = path.join(__dirname, '..', 'packages', 'network', 'package.json');
const networkPackageJson = JSON.parse(fs.readFileSync(networkPackageJsonPath, 'utf8'));
const oldPeerDep = networkPackageJson.peerDependencies['@esengine/ecs-framework'];
networkPackageJson.peerDependencies['@esengine/ecs-framework'] = `>=${coreVersion}`;
fs.writeFileSync(networkPackageJsonPath, JSON.stringify(networkPackageJson, null, 2) + '\n');
console.log(`Network peerDependencies更新: ${oldPeerDep} -> >=${coreVersion}`);
console.log('版本同步完成!');
} catch (error) {
console.error('版本同步失败:', error.message);
process.exit(1);
}
}
updateNetworkPeerDependency();