我正在尝试创建一个简单的CLI,它将创建一个文件夹结构和一些文件。结构看起来像这样:
app-name
├── app.py
├── models.py
├── static
│ ├── css
│ ├── img
│ └── js
├── templates
└── views.py
我已经看了mkdirp
库,但我意识到我必须为我想要制作的每个文件夹链接mkdirp()
函数,然后使用fs
模块创建单个文件。
到目前为止,我所尝试的是为我要创建的每个文件夹背靠背链接mkdirp()
函数。
const path = require('path');
const mkdirp = require('mkdirp-promise');
mkdirp(path.join(__dirname, 'app-name', 'static', 'css'))
.then(mkdirp(path.join(__dirname, 'app-name', 'static', 'js')))
.then(mkdirp(path.join(__dirname, 'app-name', 'static', 'img')))
.then(mkdirp(path.join(__dirname, 'app-name', 'templates')))
.then(console.log)
.catch(console.error);
这种方法似乎效率不高,特别是对于可以传递给CLI的不同类型的参数。
我考虑过创建一个包含整个文件夹结构的文件夹以及Python文件的内容,然后只复制这些文件。但我不确定这是否可行。
创建此文件夹和文件层次结构的好方法是什么?
答案 0 :(得分:0)
要完全按照您的要求进行操作有点困难。如果你只是想要可靠地创建几个目录,那么我只想创建一个带有一系列路径的函数,你可以使用.reduce()
在数组中连续迭代:
const path = require('path');
const mkdirp = require('mkdirp-promise');
function makeAllDirs(root, list) {
return list.reduce((p, item) => {
return p.then(() => {
return mkdirp(path.join(root, item));
});
}, Promise.resolve());
}
// usage
let dirs = [
"app-name/static/css",
"app-name/static/img",
"app-name/static/js",
"app-name/templates"
];
makeAllDirs(__dirname, dirs).then(() => {
// all done here
}).catch(err => {
// error here
});
答案 1 :(得分:0)
根据您的输入,这完全符合您的要求(如果用户提供结构,这可能不是最好的方法):
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
function createDirectory(dirPath) {
return promisify(fs.mkdir)(dirPath);
}
function createFile(filePath, content) {
return promisify(fs.writeFile)(filePath, content, 'utf-8');
}
function scaffoldProject(projectName) {
createDirectory(path.join(__dirname, projectName))
.then(() => {
return createDirectory(path.join(__dirname, projectName, 'static'));
})
.then(() => {
return createDirectory(path.join(__dirname, projectName, 'templates'));
})
.then(() => {
return createDirectory(path.join(__dirname, projectName, 'static', 'css'));
})
.then(() => {
return createDirectory(path.join(__dirname, projectName, 'static', 'img'));
})
.then(() => {
return createDirectory(path.join(__dirname, projectName, 'static', 'js'));
})
.then(() => {
// Last argument is the app.py's content
return createFile(path.join(__dirname, projectName, 'app.py'), '');
})
.then(() => {
// Last argument is the models.py's content
return createFile(path.join(__dirname, projectName, 'models.py'), '');
})
.then(() => {
// Last argument is the views.py's content
return createFile(path.join(__dirname, projectName, 'views.py'), '');
})
.then(() => {
console.log(`Project ${projectName} was successfully scaffolded at ${path.join(__dirname, projectName)}`);
})
.catch(error => {
console.log(error);
});
}
// Replace 'test-project' with user input
scaffoldProject('test-project');
这使用fs
模块并将其回调API转换为Promise API(promisifies)。您拨打createDirectory
或createFile
然后使用.then()
进行链接以控制流量。 .catch()
捕获链中抛出的任何错误。