有没有办法让js逐行执行这个脚本

我正在尝试制作一个脚本,每次我创建一个新的反应应用程序时都可以自动化我的项目,所以首先我制作了一个运行我的 main.js 脚本的 bat 文件


这是bat文件


@echo off

setlocal enableextensions


REM run my main

node "C:\Windows\System32\automate\main.js" %1

这是 main.js 文件


const { exec } = require("child_process");

const { replace, rename } = require("./file.js");

const axios = require("axios").default;


let state = {

  cwd: "E:/WORK/Projects",

  token: "[[my github token]]",

  project: {

    name: process.argv[2],

    path: "E:/WORK/Projects/" + process.argv[2],

    src: "E:/WORK/Projects/" + process.argv[2] + "/src",

  },

};


// init

let { cwd, project, token } = state;


//

//

// main

// create the app

exec("create-react-app " + project.name, { cwd });


// install debs

exec("npm i node-sass", { cwd: project.path });


// use sass

rename(project.src + "/index.css", "index.scss");

rename(project.src + "/App.css", "App.scss");

replace(project.src + "/index.js", "./index.css", "./index.scss");

replace(project.src + "/App.js", "./App.css", "./App.scss");


// structure my app

let code = [

  'mkdir "' + project.src + '/App"',

  'mkdir "' + project.src + '/App/Elements"',

  'mkdir "' + project.src + '/App/nav"',

  'touch "' + project.src + '/App/nav.jsx"',

  'touch "' + project.src + '/App/nav/nav.scss"',

];

code = code.join(" && ");

exec(code);


// push to github

axios({

  method: "post",

  url: "https://api.github.com/user/repos?access_token=" + token,

  data: {

    name: project.name,

  },

})

  .then((res) => {

    let repo = res.data.clone_url;

    let c = [

      "git remote add origin " + repo,

      "git push --set-upstream origin master",

      "git push",

    ].join(" && ");

    exec(c);

  })

  .catch((err) => {

    console.log(err.response.data.errors);

  });


// open in code

exec("code " + project.path);


// final message

console.log("Have Fun!");

现在一切都准备好了,但我唯一的问题是每一行都被异步执行

例如 create-react-app 命令这需要很多时间,并且每一行都取决于它首先完成


手掌心
浏览 211回答 3
3回答

慕莱坞森

您可以使用execSync代替exec:const {execSync} = require('child_process');以下是有关此功能的主要文档:NodeJs Docs具体说明:child_process.execSync() 方法通常与 child_process.exec() 相同,只是该方法在子进程完全关闭之前不会返回。当遇到超时并发送 killSignal 时,该方法将在进程完全退出之前不会返回。如果子进程拦截并处理了 SIGTERM 信号并且没有退出,则父进程会一直等到子进程退出。

qq_笑_17

这是一个可以使用锁或信号量的经典案例。只需在所需行之前锁定执行,然后将其删除。参考this for locks in js - How to implement a lock in JavaScript

白衣非少年

您可以使用 util 模块中的 promisify 将 async exec 函数转换为 promise,然后您可以使用 await exec 以使其显示为同步执行。const util = require('util');const exec = util.promisify(require('child_process').exec);然后,您可以将代码包装在这样的函数中:async function init(){  //your code  await exec("create-react-app " + project.name, { cwd });  //...}init();对于像这样的简单脚本,execSync 实际上可能更容易,但在其他情况下您可能会发现异步版本更好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript