为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

手掌心 2022-06-16 10:17:09
我正在尝试制作一个脚本,每次我创建一个新的反应应用程序时都可以自动化我的项目,所以首先我制作了一个运行我的 main.js 脚本的 bat 文件这是bat文件@echo offsetlocal enableextensionsREM run my mainnode "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",  },};// initlet { cwd, project, token } = state;////// main// create the appexec("create-react-app " + project.name, { cwd });// install debsexec("npm i node-sass", { cwd: project.path });// use sassrename(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 applet 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 githubaxios({  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 codeexec("code " + project.path);// final messageconsole.log("Have Fun!");现在一切都准备好了,但我唯一的问题是每一行都被异步执行例如 create-react-app 命令这需要很多时间,并且每一行都取决于它首先完成
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您可以使用execSync代替exec

const {execSync} = require('child_process');

以下是有关此功能的主要文档:NodeJs Docs

具体说明:

child_process.execSync() 方法通常与 child_process.exec() 相同,只是该方法在子进程完全关闭之前不会返回。当遇到超时并发送 killSignal 时,该方法将在进程完全退出之前不会返回。如果子进程拦截并处理了 SIGTERM 信号并且没有退出,则父进程会一直等到子进程退出。


查看完整回答
反对 回复 2022-06-16
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

这是一个可以使用锁或信号量的经典案例。

只需在所需行之前锁定执行,然后将其删除。

参考this for locks in js - How to implement a lock in JavaScript


查看完整回答
反对 回复 2022-06-16
?
白衣非少年

TA贡献1155条经验 获得超0个赞

您可以使用 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 实际上可能更容易,但在其他情况下您可能会发现异步版本更好。


查看完整回答
反对 回复 2022-06-16
  • 3 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信