dongzeping-cli-test
Version:
A sample npm package that runs automatically when installed
163 lines (131 loc) • 4.19 kB
JavaScript
/**
* cli-test - A npm package that copies docs to config
* @version 1.0.0
*/
const fs = require('fs');
const path = require('path');
/**
* 获取项目根目录(安装了这个包的项目根目录)
*/
function getProjectRoot() {
let currentDir = process.cwd();
console.log(`🔍 Debug: process.cwd() = ${currentDir}`);
console.log(`🔍 Debug: __dirname = ${__dirname}`);
// 如果在node_modules中运行,找到项目根目录
if (currentDir.includes('node_modules')) {
console.log(`🔍 Debug: Found 'node_modules' in path, extracting project root...`);
const nodeModulesIndex = currentDir.indexOf('node_modules');
if (nodeModulesIndex !== -1) {
currentDir = currentDir.substring(0, nodeModulesIndex);
console.log(`🔍 Debug: Project root extracted = ${currentDir}`);
}
} else {
console.log(`🔍 Debug: No 'node_modules' in path, using current directory`);
}
return currentDir;
}
/**
* 获取包目录(当前包的位置)
*/
function getPackageRoot() {
return __dirname;
}
/**
* 递归拷贝目录
*/
function copyDirectory(srcDir, destDir) {
if (!fs.existsSync(srcDir)) {
console.log(`❌ Source directory not found: ${srcDir}`);
return false;
}
// 创建目标目录
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir, { recursive: true });
}
const items = fs.readdirSync(srcDir);
items.forEach(item => {
const srcPath = path.join(srcDir, item);
const destPath = path.join(destDir, item);
const stat = fs.statSync(srcPath);
if (stat.isDirectory()) {
copyDirectory(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
console.log(`✅ Copied: ${item}`);
}
});
return true;
}
/**
* 核心功能:将包内docs拷贝到项目config目录
*/
function copyDocsToConfig() {
const packageRoot = getPackageRoot();
const projectRoot = getProjectRoot();
const docsDir = path.join(packageRoot, 'docs');
const configDir = path.join(projectRoot, 'config');
console.log('\n📋 Copying configuration files...');
console.log(`📦 Package Root: ${packageRoot}`);
console.log(`🏠 Project Root: ${projectRoot}`);
console.log(`📂 Source: ${docsDir}`);
console.log(`🎯 Target: ${configDir}\n`);
const success = copyDirectory(docsDir, configDir);
if (success) {
console.log('\n🎉 Configuration files copied successfully!');
} else {
console.log('\n❌ Failed to copy configuration files.');
}
return success;
}
/**
* 修改项目package.json,添加dzp脚本
*/
function addScriptToPackageJson() {
const projectRoot = getProjectRoot();
const packageJsonPath = path.join(projectRoot, 'package.json');
console.log('\n📝 Updating package.json scripts...');
console.log(`📄 Target package.json: ${packageJsonPath}`);
// 检查package.json是否存在
if (!fs.existsSync(packageJsonPath)) {
console.log('❌ package.json not found in project root');
return false;
}
try {
// 读取package.json
const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8');
const packageJson = JSON.parse(packageJsonContent);
// 确保scripts对象存在
if (!packageJson.scripts) {
packageJson.scripts = {};
}
// 添加dzp脚本(如果不存在)
if (!packageJson.scripts.dzp) {
packageJson.scripts.dzp = 'node dzp.js';
// 写回文件,保持格式
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
console.log('✅ Added "dzp": "node dzp.js" to scripts');
return true;
} else {
console.log('⚠️ "dzp" script already exists, skipping...');
return false;
}
} catch (error) {
console.error(`❌ Error updating package.json: ${error.message}`);
return false;
}
}
// 主要执行逻辑:当包被导入时自动运行
function init() {
console.log('\n🚀 cli-test package loaded!');
// 执行拷贝
copyDocsToConfig();
// 修改package.json
addScriptToPackageJson();
}
// 自动执行
init();
// 导出主要功能
module.exports = {
copyDocsToConfig,
addScriptToPackageJson
};