通过节点为节点项目 运行 创建 bootstrap 脚本
creating a bootstrap script for node projects run by node
我正在为 bootstrap 我的所有项目制作一个脚本,这样项目创建就像 运行 'node bootstrap.js 一样简单' 然后脚本初始化目录,创建基本的项目文件夹结构,安装依赖项(例如:nodemon、dotenv、jest 等)并在 package.json 中配置脚本,例如 'nodemon -r dotenv/config index.js' 用于使用 dotenv 预加载启动 nodemon。当我启动脚本时,我会创建文件夹结构,然后在每个文件夹中创建示例文件,最后执行脚本的以下部分:
// Lets add the scripts inside package.json
addScriptsToPackageJson = () => {
const packageJsonFilename = './package.json';
let packageJson = JSON.parse(fs.readFileSync(packageJsonFilename, 'utf8'));
packageJson.scripts['test'] = 'jest --coverage';
packageJson.scripts['dev'] = 'nodemon -r dotenv/config index.js';
fs.writeFile(packageJsonFilename, JSON.stringify(packageJson, null, 2), function writeJSON(err) {
if (err) return console.log(err);
console.log(JSON.stringify(packageJson));
console.log('writing to ' + packageJsonFilename);
});
}
// Promisify exec command
function execShellCommand(cmd) {
const exec = require('child_process').exec;
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
if (error) {
console.warn(error);
}
resolve(stdout? stdout : stderr);
});
});
}
// Initialize project and download base dependencies
execShellCommand('npm init -y')
.then(response => execShellCommand('npm install --save-dev nodemon dotenv jest'))
.then(response => execShellCommand('npm install express'))
.then(addScriptsToPackageJson())
.catch(error => {console.log("ALGO SALIO MAL")});
但是函数 addScriptsToPackageJson 抛出以下错误:
internal/fs/utils.js:220
throw err;
^
Error: ENOENT: no such file or directory, open './package.json'
at Object.openSync (fs.js:440:3)
at Object.readFileSync (fs.js:342:35)
at addScriptsToPackageJson (F:\Repositories\node-project-bootstraper\prueba\bootstrap.js:94:37)
at Object.<anonymous> (F:\Repositories\node-project-bootstraper\prueba\bootstrap.js:109:11)
at Module._compile (internal/modules/cjs/loader.js:955:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
at Module.load (internal/modules/cjs/loader.js:811:32)
at Function.Module._load (internal/modules/cjs/loader.js:723:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
at internal/main/run_main_module.js:17:11 {
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: './package.json'
}
我认为这是因为在编译时文件 package.json 不存在,它只存在于 'npm init -y' 命令已完成执行。
关于如何解决这个问题有什么想法吗?我真的很想制作一个无需用户干预即可制作所有内容的脚本。
您过早地调用了函数。而不是
.then(addScriptsToPackageJson())
做
.then(addScriptsToPackageJson)
我正在为 bootstrap 我的所有项目制作一个脚本,这样项目创建就像 运行 'node bootstrap.js 一样简单' 然后脚本初始化目录,创建基本的项目文件夹结构,安装依赖项(例如:nodemon、dotenv、jest 等)并在 package.json 中配置脚本,例如 'nodemon -r dotenv/config index.js' 用于使用 dotenv 预加载启动 nodemon。当我启动脚本时,我会创建文件夹结构,然后在每个文件夹中创建示例文件,最后执行脚本的以下部分:
// Lets add the scripts inside package.json
addScriptsToPackageJson = () => {
const packageJsonFilename = './package.json';
let packageJson = JSON.parse(fs.readFileSync(packageJsonFilename, 'utf8'));
packageJson.scripts['test'] = 'jest --coverage';
packageJson.scripts['dev'] = 'nodemon -r dotenv/config index.js';
fs.writeFile(packageJsonFilename, JSON.stringify(packageJson, null, 2), function writeJSON(err) {
if (err) return console.log(err);
console.log(JSON.stringify(packageJson));
console.log('writing to ' + packageJsonFilename);
});
}
// Promisify exec command
function execShellCommand(cmd) {
const exec = require('child_process').exec;
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
if (error) {
console.warn(error);
}
resolve(stdout? stdout : stderr);
});
});
}
// Initialize project and download base dependencies
execShellCommand('npm init -y')
.then(response => execShellCommand('npm install --save-dev nodemon dotenv jest'))
.then(response => execShellCommand('npm install express'))
.then(addScriptsToPackageJson())
.catch(error => {console.log("ALGO SALIO MAL")});
但是函数 addScriptsToPackageJson 抛出以下错误:
internal/fs/utils.js:220
throw err;
^
Error: ENOENT: no such file or directory, open './package.json'
at Object.openSync (fs.js:440:3)
at Object.readFileSync (fs.js:342:35)
at addScriptsToPackageJson (F:\Repositories\node-project-bootstraper\prueba\bootstrap.js:94:37)
at Object.<anonymous> (F:\Repositories\node-project-bootstraper\prueba\bootstrap.js:109:11)
at Module._compile (internal/modules/cjs/loader.js:955:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
at Module.load (internal/modules/cjs/loader.js:811:32)
at Function.Module._load (internal/modules/cjs/loader.js:723:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
at internal/main/run_main_module.js:17:11 {
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: './package.json'
}
我认为这是因为在编译时文件 package.json 不存在,它只存在于 'npm init -y' 命令已完成执行。
关于如何解决这个问题有什么想法吗?我真的很想制作一个无需用户干预即可制作所有内容的脚本。
您过早地调用了函数。而不是
.then(addScriptsToPackageJson())
做
.then(addScriptsToPackageJson)