1.ptm-cli使用说明projecttemplatemanagercli一款管理项目模板/项目的脚手架工具,具有添加模板/项目、编辑模板/项目、删除模板/项目的功能,查看模板/项目、下载项目、基于模板初始化项目等1.特点ptm-cli兼容github和gitee码云:很多自研脚手架只能在github上下载模板/项目(底层使用download-git-repo),随着国内码云的发展,国内很多开发者也在码云上管理代码,兼容gitee也是很有必要的;目前,现有的脚手架轮子都不兼容码云!管理功能齐全:大部分脚手架只对某个模板进行初始化和下载,只有指定的初始化函数;ptm-cli可以对模板和项目进行管理,不仅可以自由增删优秀的开源项目(如vue),还可以对自己开发的项目模板进行添加删除和编辑;2、安装$npminstallptm-cli-g3,安装完成后使用1)基本帮助命令,在电脑终端输入相应命令即可查看并进行相关操作。#查看脚手架可执行的相关命令$ptm#查看当前版本$ptm-V#查看帮助$ptm-h2)添加模板/项目输入命令:$ptm-add根据终端提示输入相关信息:模板名称:新增模板自定义命名(推荐使用引文);url:模板/项目在github或码云上的https/ssh克隆地址链接;branch:模板/项目在GitHub或码云上的分支名称(默认master);delGitInfo:是否删除模板/项目中原作者git的开发信息(默认为true删除)。对于模板管理,建议默认设置为true,即初始化模板不包含其他人的git信息。对于项目管理(自己的项目),建议自己保留开发相关的git信息;description:模板/项目的描述(默认为空);示例:xxx%ptm-add?请输入模板名称vpblogs?请输入模板地址(https/ssh)git@gitee.com:goodloving/vpblogs.git?请输入模板分支(默认master)master?是否删除模板中的.git信息(默认删除)true?请输入模板描述(默认为空)基于vuepress创建个人博客主页的模板项目添加模板成功!最终模板列表为:vpblogsurl:git@gitee.com:goodloving/vpblogs.gitbranch:master描述:基于vuepress创建个人博客主页的模板项目delGitInfo:truexxx%3)编辑模板/项目输入命令:$ptm-edittemplateNamekeycontent根据终端提示输入相关信息:templateName:我添加的模板/项目的名称;key:要编辑的模板/项目的关键信息,包括:url、branch、delGitInfo、description;content:keyword对应的内容被编辑替换内容;示例(修改模板vpblogs的delGitInfo信息):xxx%ptm-editvpblogsdelGitInfofalse修改模板成功!最终模板列表为:vpblogsurl:git@gitee.com:goodloving/vpblogs.gitbranch:master描述:基于vuepress创建个人博客主页的模板项目delGitInfo:falsexxx%4)查看模板/项目输入命令:$ptm-list示例:xxx%ptm-list模板列表为:vpblogsurl:git@gitee.com:goodloving/vpblogs.gitbranch:master描述:基于vuepress创建个人博客主页的模板项目delGitInfo:falsexxx%5)删除模板/项目输入命令:$ptm-del例子:xxx%ptm-del?请输入要删除的模板名称。vpblogs删除模板成功!最终模板列表为:xxx%6)根据模板创建/初始化项目输入命令:$ptm-initvpblogstestPTM示例(根据模板vpblogs新建项目testPTM):xxx%ptm-initvpblogstestPTMStart正在创建项目~?创建中···项目创建成功~开始你的项目开发吧!xxx%执行完成后,可以在当前终端所在目录下看到名为testPTM的工程文件!二、ptm-cli脚手架开发1、知识储备1)Commander是一个完整的node.js命令行解决方案,用于处理终端命令行输入的命令,编写命令行命令。第三方npm库常用API:declareprogramvariableconst{program}=require('commander');命令行输出版本号program.version('0.0.1');命令行输出指令提示program.usage("\[Options]");命令行输出单个命令输入规范提示符program.command("ptm-add","添加新的模板库!")解析命令行参数program.parse(process.argv);···commander详细api2)询问者处理交互节点。用于js嵌入式命令行界面的第三方npm库。常用API:声明查询者变量constinquirer=require('inquirer');具体使用方法inquirer.prompt([/放入可交互提供的问题/]).then(answers=>{//命令行接收到}的输入参数).catch(error=>{//错误报告获取});···查询详细api3)git-clone通过shell命令克隆一个git仓库的第三方npm库。常用API:声明git-clone变量constclone=require('git-clone');具体用法clone(repo,targetPath,[options],cb);clone一个带有repo路径的git仓库到targetPath目录,回调函数cd用于抓取clone结果;options可选参数:git:git二进制路径(可选)。浅:当为真时,克隆深度为1(可选)。结帐:切换到当前分支(可选)。git-clonedetailedapi4)Chalk一个改变终端输出风格的第三方npm库。常用API:声明chalk变量constchalk=require('chalk');具体用法console.log(chalk.blue('Helloworld!'));chalkdetailedapi5)或第三方npm,它添加了一个优雅的终端运行程序库。常用API:声明ora变量constora=require('ora');具体用法constspinner=ora('提示内容...');开始显示微调器spinner.start()错误/无法显示微调器。fail()成功,轮子显示spinner.succeed()···或详细api6)rimraf封装了rm-rf命令,是一个用于删除文件和文件夹的第三方npm库。常用API:声明rimraf变量constrm=require("rimraf").sync;具体用法,删除指定文件/文件夹rm(file,[opts],callback)rimraf详解api2,初始化项目新建项目文件夹PTM_CLI,打开项目文件夹下的终端执行初始化操作npminit,与terminal生成包含项目信息的package.json文件,依次安装步骤1中要用到的六个第三方npm库:npminstallxxx-g(也可以直接将依赖写入package.json中的dependencies中并直接执行npminstall);打开package.json文件,添加终端命令执行语句(bin区下):{"name":"ptm-cli","private":false,"author":{"name":"wawoweb","wechat(公众号)":"wawoweb/wowWEB","wechat":"h17179797429","email":"936106161@qq.com"},"bin":{"ptm":"./bin/ptm.js","ptm-init":"./bin/ptm-init.js","ptm-list":"./bin/ptm-list.js","ptm-add":"./bin/ptm-add.js","ptm-del":"./bin/ptm-del.js","ptm-edit":"./bin/ptm-edit.js"},···"dependencies":{"chalk":"^4.1.0","commander":"^6.2.1","git-clone":"^0.1.0","inquirer":"^7.3.3","ora":"^5.1.0","rimraf":"^3.0.2"}}同时在项目文件夹下新建目录bin,并在其下的package.json中新建六个对应的文件bin文件夹:./bin/ptm.js终端命令ptm执行文件./bin/ptm-init.js终端命令ptm-init执行文件(根据模板初始化项目)./bin/ptm-list.js终端命令ptm-list执行文件(查看当前模板列表)。/bin/ptm-add.js终端命令ptm-add执行文件(添加新模板)./bin/ptm-del.js终端命令ptm-del执行文件(删除指定模板)./bin/ptm-edit.js终端命令ptm-edit执行文件(编辑指定模板的指定信息内容),最后在根目录新建一个模板存储文件template.json。项目目录结构如下:3、功能开发在上面添加#!/usr/bin/env节点:配置#!/usr/bin/env节点,解决了不同系统节点路径不同的问题,让系统动态搜索节点以执行脚本文件1)ptm(scaffoldingcommandprompt)解析:当用户不理解ptm-cli时,输入ptm可以向用户展示可用的命令语句和含义(commander);code(ptm.js):#!/usr/bin/envnodeconstprogram=require("commander");constpackage=require("../package.json");//定义当前版本//定义使用方法//定义五个指令program.version(package.version).usage("[Options]").command("ptm-add","Addatemplatelibrary!").command("ptm-del","删除模板库!").command("ptm-list","查看模板库列表!").command("ptm-edittemplatenamekeycontent","修改模板库信息!").command("ptm-inittemplatenameprojectName","CreatebasedontemplatelibraryAnewproject!");//解析命令行参数program.parse(process.argv);2)ptm-add(添加模板)分析:将用户自定义的模板添加到template.json中并存储,需要与用户共享交互(inquirer),涉及文件(fs)的读写,显示执行结果给用户(粉笔);code(ptm-add.js):#!/usr/bin/envnode//交互式命令行库constinquirer=require("inquirer");//控制台样式库constchalk=require("chalk");//node内置文件模块库constfs=require("fs");//读取模板配置文件consttpConfig=require(`${__dirname}/../template.json`);//打印的公共函数templatelistconstprintPtmList=require("../utils").printPtmList;//自定义交互式命令行问答letquestions=[{name:"name",type:"input",message:"请输入模板名称",validate(val){if(val===""){return"模板名称不能为空!";}elseif(tpConfig[val]){return"模板名称已经存在!";}else{返回真;}},},{name:"url",type:"input",message:"请输入模板的URL(https/ssh)",validate(val){if(val==="")return"模板地址不能为空!";返回真;},},{name:"branch",type:"input",message:"请输入模板分支(默认master)",default:"master",},{name:"delGitInfo",type:"input",message:"是否删除模板中的.git信息(默认删除)",default:true,},{name:"description",type:"input",message:"请输入模板描述(默认为空)”,默认:“”,},];inquirer.prompt(问题)。then((answers)=>{//获取用户输入的内容let{name,url,branch,description,delGitInfo}=answers;//过滤Unicode字符tpConfig[name]={url,branch,description,delGitInfo,};//将模板信息写入template.json文件sfs.writeFile(`${__dirname}/../template.json`,JSON.stringify(tpConfig),"utf-8",(err)=>{if(err){console.log(chalk.red(`\nadd模板失败:${err}\n`));}else{console.log(chalk.green("\n添加模板成功!\n"));console.log("最终模板列表为:");printPtmList(tpConfig);}});});模板列表打印功能封装(utils.js):constchalk=require("chalk");constprintPtmList=(tpConfig)=>{//遍历要显示的模板for(constkeyintpConfig){if(tpConfig.hasOwnProperty(key)){constitem=tpConfig[key];console.log(chalk.blue(`${key}`));for(constiinitem){if(item.hasOwnProperty.call(item,i)){constel=item[i];安慰。日志(粉笔。蓝色(`${i}:${el}`));}}}}};module.exports={printPtmList};3)ptm-list、ptm-del、ptm-edit分析:ptm-list:读取template.json文件(fs),输出并打印json格式的数据(chalk);ptm-del:读取template.json文件(fs),与用户(查询者)交互,删除指定模板信息,输出删除结果(chalk)ptm-edit:读取template.json文件(fs),与用户互动交互(inquirer),修改指定模板(commander)的信息,并输出最终的修改结果(chalk);代码简单(略)4)ptm-init(根据模板初始化项目)分析:提示用户输入ptm-init命令所需的参数设置,判断输入参数,读取template.json信息为根据新建项目提取模板信息,从github或gitee(码云)克隆git库文件,根据配置要求判断是否删除原作者的git开发信息。输出初始化结果!代码ptm-init.js#!/usr/bin/envnodeconstprogram=require("commander");constchalk=require("粉笔");constora=require("ora");constgitclone=require("git-clone");consttpConfig=require(`${__dirname}/../template`);constrm=require("rimraf").sync;program.usage("templatenameprojectName").parse(process.argv);//判断输入if(program.args.length<1){returnprogram.help();}//输入参数提取lettemplateName=program.args[0];letprojectName=program.args[1];//参数验证if(!tpConfig[templateName]){console.log(chalk.red("当前模板不存在!\n"));return;}if(!projectName){console.log(chalk.red("新建项目名称不能为空!\n"));return;}lettemp=tpConfig[templateName];//提取模板的urlleturl=temp.url;//提取分支letbranch=temp.branch;console.log(chalk.greenBright("\n开始创建一个项目~\n"));//显示加载图标constspinner=ora("Creating...");spinner.start();//下载所需的额外参数letcloneOptions={checkout:branch,shallow:branch==="master",};//在git上下载模板代码gitclone(url,projectName,cloneOptions,(err)=>{if(err){spinner.fail();console.log(chalk.red(`\n创建项目失败:${err}\n`));}else{if(temp.deldelGitInfo){//删除.git相关文件rm(projectName+"/.git");}//成功的spinner.succeed();console.log(chalk.green("\n项目创建成功~\n"));console.log(chalk.green("开始你的项目开发!"));}});4、npmrelease1)确认package.json中的npmrelease内容是否完整正确"name":"ptm-cli",//npm上发布的库名称"version":"1.0.0",//Currentrelease版本号(x.y.z格式规定:x值大的版本号,不同的大版本号表示不向后兼容;带y的小版本号,当前版本有重大变化,向后兼容;z代码小改或bug修改)"description":"",//对npm库的简要说明"private":false,//是否设置公开"keywords":[],//搜索关键字设置npm...2)npm登录并发布到npm网站注册一个账号;在终端输入npmlogin,根据提示输入用户名、密码、邮箱;在终端输入npmpublish进行发布,查看结果是否发布成功;强制撤销24小时内发布的npm库,输入npmunpublish--force;3)npm站点搜索中的npm发布验证类型问题如果能搜索到发布的npm库名,说明已经发布成功!本地下载验证打开本地终端,输入npminstallptm-cli-g下载安装发布的npm包。安装后,执行自定义命令即可生效!