通过节点为节点项目 运行 创建 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)