该仓库是开发项目或者组件的初始化脚手架的尝试
|---commands
| |---init
| |---lib
| |---__tests__
|---core
| |---cli
| | |---bin
| | |---dist
| | |---lib
| | |---__tests__
| |---exec
| |---lib
| |---__tests__
|---models
| |---command
| | |---lib
| | |---__tests__
| |---package
| |---lib
| |---__tests__
|---templates
| |---vue3-vite
| | |---template
| | |---public
| | |---src
| | |---assets
| | |---components
| |---vue3-webpack
| |---template
| |---public
| |---src
| |---assets
| |---components
| |---router
| |---store
| |---views
|---utils
|---get-npm-info
| |---lib
| |---__tests__
|---log
| |---lib
| |---__tests__
|---mongo
| |---lib
| |---__tests__
|---request
| |---lib
| |---__tests__
|---utils
|---lib
|---__tests__
async function prepare () {
// 检查cli版本号 输出本地版本号
checkPackageVersion();
// 检查Node版本号
// checkNodeVersion();
// 检查是否root启动 防止root创建 以后因为权限不能修改
checkRoot();
// 检查是否用户主目录
checkUserHome();
// 检查环境变量
checkEnv();
}
//声明命令行名称 //帮助信息 用户提示 命令 参数 //声明版本 // 定义选项-d --debug 开启调试模式 定义选项-tp --target_path 脚本路径如 使用本地脚本初始化项目 传入该参数; 注册 init 命令,-f| --force 是否强制初始化项目 匹配不到对应命令 将会报错未知命令; 不传入参数 将会显示帮助信息;
function registerCommand() {
program
.name(pkName)
.usage("<command> [options]")
.version(pkg.name)
.option("-d, --debug", "display some debugging")
// 放在command写不行 一定要现在这样
.option('-tp, --target_path <path>', "the path of executable file");
program
.command("init [project-name]")
.description("project init")
.option('-f, --force', '是否强制初始化项目')
.action(async (...args) => {
await cmdPreAction();
exec(...args);
});
program.on("option:debug", function () {
process.env.LOG_LEVEL = "verbose";
log.level = process.env.LOG_LEVEL;
});
// 放在command写不行 一定要现在这样
program.on("option:target_path", function (val) {
process.env.targetPath = val;
});
program.on("command:*", function (operands) {
const availableCommands = program.commands.map((cmd) => cmd.name());
if (!availableCommands.includes(operands[0])) {
log.warn(
colors.yellow(
`未知命令${operands[0]},可用命令:${availableCommands.join(",")}`
)
);
}
});
// console.log(process.argv, program.opts());
// 如果没有参数和命令
// program.parse(process.argv);
// 处理函数支持async,相应的,需要使用.parseAsync代替.parse。
program.parseAsync(process.argv);
// 没有执行命令 提示program.args 只有命令,process.argv.slice(2):命令+options
if (!program.args || program.args.length < 1) {
program.outputHelp();
}
}
通过这两个选项可以修改帮助信息的首行提示,name属性也可以从参数中推导出来。例如: program .name("my-command") .usage("[global options] command") 帮助信息开头如下: Usage: my-command [global options] command
开始前: 是否使用淘宝源 : await useTaobaoRegistry(); 检查cli是否最新版本-》否提示更新: await chekckGlobalUpdate(); 然后 开始执行@fri-cli/exec
1.如果用户传入targe_path参数值 则通过路径获取其Npm包名;实例化Npm包管理类Package; 没有tp target_path传参,默认Npm为@fri-cli/init,实例化Package 检查是否本地缓存没有下载,有则更新到最新版本; 2.获取对应初始化Npm根执行脚本,运用spawn创建子进程进行初始化
const rootFile = pk.getNpmRootFile();
if (rootFile) {
try {
const args = Array.from(arguments);
let cmdObj = args[args.length - 1];
let o = Object.assign({});
Object.keys(cmdObj).forEach(key => {
if (key !== 'parent' && !key.startsWith('_') && cmdObj.hasOwnProperty(key)) {
o[key] = cmdObj[key];
}
});
args[args.length - 1] = o;
const code = `require('${rootFile}').apply(null, ${JSON.stringify(args)})`;
// log.verbose(code);
const res = await execPromise('node', ['-e', code], {
cwd: process.cwd(),
stdio: 'inherit',
});
log.verbose('res:', res);
if (res) throw new Error('执行不成功!');
} catch (error) {
log.error(error.message);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。