Error: ENOENT: no such file or directory, access

Error: ENOENT: no such file or directory, access

请!!帮我弄清楚为什么它会抛出“错误:ENOENT:没有这样的文件或目录,访问”

我已经在项目中创建了一个模板目录。

这是我的项目文件结构:

> bin
>src
  >cli.js
  >main.js
> templates
  > javascript
    >src
    >package.json
>test-dir
>.gitignore
>LICENSE
>package.json
>readme.md

cli.js

import arg from "arg";
import inquirer from "inquirer";
import { chakatiFire } from "./main.js";

function parseArgumnetsOptions(rawArguments) {
  let args = arg(
    {
      "--git": Boolean,
      "--help": Boolean,
      "--yes": Boolean,
      "--install": Boolean,
      "--g": "--git",
      "--h": "--help",
      "--y": "--yes",
      "--i": "--install",
    },
    {
      argv: rawArguments.slice(2),
    }
  );
  return {
    skipPrompts: args["--yes"] || false,
    git: args["--git"] || false,
    template: args._[0],
    runInstall: args["--install"] || false,
  };
}

async function promptErrorMissingOpts(opts) {
  const defaultTemplate = "JavaScript";
  if (opts.skipPrompts) {
    return {
      ...opts,
      template: opts.template || defaultTemplate,
    };
  }
  const displayOptions = [];
  if (!opts.template) {
    displayOptions.push({
      type: "list",
      name: "template",
      message: "What template would you like to use?",
      choices: ["JavaScript"],
      default: defaultTemplate,
    });
  }

  if (!opts.git) {
    displayOptions.push({
      type: "confirm",
      name: "git",
      message: "Would you like to use git?",
      default: false,
    });
  }

  const userInput = await inquirer.prompt(displayOptions);
  return {
    ...opts,
    template: opts.template || userInput.template,
    git: opts.git || userInput.git,
  };
}

export async function cli(args) {
  let opts = parseArgumnetsOptions(args);
  opts = await promptErrorMissingOpts(opts);
  // console.log(opts);
  await chakatiFire(opts);
}

main.js

import chalk from "chalk";
import fs from "fs";
import path from "path";
import ncp from "ncp";
import { promisify } from "util";

// access
const access = promisify(fs.access);

// reccusive copy
const copy = promisify(ncp);

// async function to copy template files
async function copyTemplateFiles(opts) {
  return copy(opts.templateDirectory, opts.targetDirectory, {
    clobber: false,
  });
}

export async function chakatiFire(opts) {
  opts = {
    ...opts,
    targetDirectory: opts.targetDirectory || process.cwd(),
  };

  const fullPathName = new URL(import.meta.url).pathname;
  const templateDir = path.resolve(
    fullPathName.substr(fullPathName.indexOf("/")),
    "../../templates",
    opts.template.toLowerCase()
  );
  opts.templateDirectory = templateDir;

  try {
    await access(templateDir, fs.constants.R_OK);
  } catch (err) {
    console.log(chalk.red(`Template directory ${templateDir} does not exist`));
    console.log(err);
    process.exit(1);
  }

  console.log("Copy project files");
  await copyTemplateFiles(opts);
  console.log(chalk.green(`Creating project from template ${opts.template}`));
  return true;
}

当我 运行 命令(chakati-fire javascript --git)在 test-dir 中时,它会像这样抛出错误=>

PS D:\JavaScript_Projects\chakati\chakati-fire\test-dir> chakati-fire javascript --git 模板目录 D:\D:\JavaScript_Projects\chakati\chakati-fire\templates\javascript 不存在 [错误:ENOENT:没有那个文件或目录,访问'D:\D:\JavaScript_Projects\chakati\chakati-fire\templates\javascript'] { 错误号:-4058, 代码:'ENOENT', 系统调用:'access', 路径:'D:\D:\JavaScript_Projects\chakati\chakati-fire\templates\javascript' }

您从代码中获得的路径是 D:\D:\JavaScript_Projects\chakati\chakati-fire\templates\javascript(双 D:\),它不存在。

问题是在开始时导致额外的 D:\。因此,我们必须使用 templateDir.substring(3).

templateDir 变量中删除前 3 个字符

这是解决方案

已更新main.js

import chalk from "chalk";
import fs from "fs";
import path from "path";
import ncp from "ncp";
import { promisify } from "util";

// access
const access = promisify(fs.access);

// reccusive copy
const copy = promisify(ncp);

// async function to copy template files
async function copyTemplateFiles(opts) {
  return copy(opts.templateDirectory, opts.targetDirectory, {
    clobber: false,
  });
}

export async function chakatiFire(opts) {
  opts = {
    ...opts,
    targetDirectory: opts.targetDirectory || process.cwd(),
  };

  const fullPathName = new URL(import.meta.url).pathname;
  let templateDir = path.resolve(
    fullPathName.substr(fullPathName.indexOf("/")),
    "../../templates",
    opts.template.toLowerCase()
  );
  templateDir = templateDir.substring(3);  // <-- This is the fix.
  opts.templateDirectory = templateDir;

  try {
    await access(templateDir, fs.constants.R_OK);
  } catch (err) {
    console.log(chalk.red(`Template directory ${templateDir} does not exist`));
    console.log(err);
    process.exit(1);
  }

  console.log("Copy project files");
  await copyTemplateFiles(opts);
  console.log(chalk.green(`Creating project from template ${opts.template}`));
  return true;
}