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;
}
请!!帮我弄清楚为什么它会抛出“错误: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;
}