无法导航到Node.js中的适当文件夹

时间:2020-01-07 05:56:01

标签: javascript node.js asynchronous promise async-await

我正在尝试创建一个函数,该函数可以提取一个远程存储库,然后浏览此存储库并安装它的依赖项,但是由于某种原因,它无法在克隆的存储库中安装依赖项并将其安装到外部:

const spinner = clui.Spinner;
const git = require("simple-git/promise");
const path = require("path");
const { install } = require("pkg-install");

async function pullRepo() {
  const pulling = new spinner("Initializing project...");
  const installing = new spinner("Installing dependencies...");
  const rep = await inquirer.DirectoryName();
  const package = path.join(rep.project, "package.json");
  pulling.start();
  await git()
    .silent(true)
    .clone("git@github.com:blacklane/create-blacklane-app.git", rep.project)
    .then(async () => {
      pulling.stop();
      console.log(`working directory:`, process.cwd());
      // check file exist asynchronously
      fs.access(package, fs.constants.F_OK, err => {
        console.log(`${package} ${err ? "does not exist" : "exists"}`);
      });

      installing.start();
      const obj = JSON.parse(fs.readFileSync(package, "utf8"));
      const dependencies = { ...obj.dependencies, ...obj.devDependencies };
      process.chdir(rep.project); // navigate to directory to install dpendencies
      console.log(`new working directory from git:`, process.cwd());
      const { stdout } = await install(dependencies, {
        dev: true,
        prefer: "npm"
      });
      console.log(stdout);
      installing.stop();
    })
    .catch(error => console.error("failed: ", error));
  // progress.finish();
}

1 个答案:

答案 0 :(得分:0)

之所以会发生这种情况是因为安装无法以某种方式访问​​克隆的存储库。可能是因为运行Node进程的底层shell仍然相同。

以下是工作代码:

const clui = require('clui');
const spinner = clui.Spinner;
const git = require("simple-git/promise");
const path = require("path");
const fs = require('fs');
const fsPromises = fs.promises;
const { spawn } = require('child_process');

async function pullRepo(repo, dirName) {
  const pulling = new spinner("Initializing project...");
  const installing = new spinner("Installing dependencies...");

  pulling.start();
  await git().silent(true).clone(repo, dirName);

  pulling.stop();

  const package = path.join(dirName, "package.json");
  // check file exist asynchronously
  await fsPromises.access(package, fs.constants.F_OK);

  installing.start();

  const npmInstall = spawn('npm', ['i'], { cwd: dirName });

  npmInstall.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
  });

  npmInstall.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
    installing.stop();
  });

  npmInstall.on('close', (data) => {
    installing.stop();
  });

}

const repoToPull = "https://github.com/facebook/create-react-app.git"; // can be any repo
const dirToPullTo = path.join(__dirname,'gitpull'); // directory you want to pull it to.
pullRepo(
  repoToPull,
  dirToPullTo
).then(res => console.log(res));

此代码需要更好的错误处理。

等待诺言时,您无需添加.then