✅ 操作成功!

简易脚手架

发布时间:2023-06-16 作者:admin 来源:文学

简易脚手架

简易脚手架

-

2023年3月19日发(作者:数据专线)

svn拉取项⽬代码_前端项⽬搭建部署全流程(四):脚⼿架与

业务模块构建

1.前⾔

继上⼀篇⽂章之后⼀个简单的React项⽬模板已经搭建好了,这篇⽂章主要写⼀下简易脚⼿架以及业务模块的⽣成命令⾏,以往我们使⽤较

多的是vue-cli、create-react-app等开源脚⼿架,但是这些脚⼿架不⼀定符合我们当前使⽤的环境(⽐如公司的通⽤脚⼿架),这个时候我们

就需要针对使⽤环境搭建⼀个脚⼿架,来提升整体的开发效率。

为什么要使⽤脚⼿架?简单描述⼏点:

1.减少重复的⼯作,不需要在内部通过ctrl+c、ctrl+v的⽅式复制项⽬结构

2.可以保持整个⼯程的项⽬结构以及编码规范保持⼀致等

......

2.⽀持的功能

这个脚⼿架写的⽐较简单,主要实现了两个功能:

it根据可选仓库拉取远程模板,初始化⼀个项⽬

eate根据GIT仓库拉取业务模块模板,⽣成业务⽊块项⽬结构(这个模板没有实现功能,可以从这些⽅⾯去⼊⼿,⽐如包含⼀个

标砖的查询界⾯或者内置⼀些通⽤的⽅法增、删、查、改等,可以快速构建⼀个简单的查询界⾯)

3.初始化项⽬

npminit-y

3.1.安装依赖

yarnaddchalkcommanderdownload-git-repoinquirernode-svn-ultimateora--dev

chalk修改控制台输出内容样式

commander命令⾏⼯具

download-git-repo从GIT拉取远程模板

inquirer交互式命令⾏⼯具

node-svn-ultimate从SVN拉取远程模板

ora显⽰loading动画

3.2.创建bin⽬录

在bin⽬录下创建⽂件,⽂件顶部注解是告诉系统⽤node去执⾏,添加init命令

#!/usr/bin/envnode

constprogram=require('commander');

//定义当前版本

//定义使⽤⽅法

//定义四个指令

program

.version(require('../').version)

.usage('[options]')

//后期扩展⽀持根据配置的地址初始化模板

//mand("init-config","generateanewprojectfromaconfigtemplate")

mand('init','generateanewprojectfromgit')

mand('create','createanewbusinesspagefromgit');

//解析命令⾏参数

();

创建完改⽂件我们通过node./bin/work-cli执⾏,控制台会出现如下结果

如果每次都输⼊node./bin/work-cli就⽐较⿇烦了,我们重新在中增加启动命令

{

"name":"work-cli",

"version":"0.0.1",

"description":"workcli",

"main":"",

"bin":{

"work":"bin/"

},

...

}

然后通过npmlink挂载到全局,这样就只需要输⼊work就可以运⾏了

我们可以通过npmlist-g--depth0查看全局的依赖,然后通过npmunlink卸载挂载到全局的命令,卸载的命令名就是当前⼯程

下中的name

4.编写command命令

命令

当执⾏workinit时,node会⾃动从bin⽬录下查找的⽂件

workinit

代码如下,处理argv的参数以及分发到对应的仓库⽂件拉取模板,然后删除从仓库拉取下来之后⽬录中的.git/.svn⽂件,让⽬

录与拉取仓库解绑,⽬录⽂件不展⽰仓库状态图标

#!/usr/bin/envnode

constprogram=require('commander');

constchalk=require('chalk');

constora=require('ora');

constinitSvn=require('./work-cli-svn');

constinitGit=require('./work-cli-git');

constdeleteFolder=require('./common/deleteFile');

('');

();

//当没有输⼊参数的时候提⽰

if(<1)();

constprojectName=[0];

//校验下项⽬名称

if(!projectName){

(('nProjectshouldnotbeempty!n'));

return;

}

constwarehouseType=[1];

//校验仓库类型

if(!warehouseType){

(('nWarehouseshouldnotbeempty!n'));

return;

}

(('nStartgenerating...n'));

//加载图标

constspinner=ora('Downloading...');

();

constcallBack=(err,fileName)=>{

d();

if(err){

(('nCopyprojecttemplateexception'));

(`n${err}`);

}else{

try{

deleteFolder('./'+projectName,fileName);

}catch(error){

(('nDelete'+fileName+'folderexception,butdoesnotaffectoperation'));

}

(('nGenerationcompleted!'));

('nTogetstarted');

(`ncd${projectName}n`);

}

};

if(warehouseType==='svn'){

initSvn(projectName).then((err)=>{

callBack(err,'.svn');

});

}else{

constrepository='direct:/huhaiqing106/';

initGit(repository,projectName).then((err)=>{

callBack(err,'.git');

});

}

Git仓库拉取的时候repository需要特别注意下地址⼀定要带上direct:,GIT地址从这⾥copy,然后加上direct:

-cli-git⽂件

这个⽂件很简单,就是从GIT拉取模板

constdownload=require('download-git-repo');

s=(repository,projectName)=>{

returnnewPromise((resolve,reject)=>{

download(repository,projectName,{clone:true},function(err){

resolve(err);

});

});

};

-cli-svn⽂件

constsvnUltiMate=require('node-svn-ultimate');

s=(projectName)=>{

constsvnUrl='xxxx';

returnnewPromise((resolve,reject)=>{

ut(svnUrl,projectName,{username:'xxx',password:'xxx'},function(err){

resolve(err);

});

});

};

这个⽂件是从SVN仓库拉取模板,这⾥需要注意⼏点,因为node是通过命令⾏去拉取的模板,所以我们的环境需要⽀持svn命令,参考如

下:

step1

安装SVN命令⾏⼯具,附下载地址

下载ApacheSubversioncommandlinetools,这是⼀个可以在cmd下使⽤的命令⾏⼯具,解压后把⾥⾯bin⽬录这个路径添加到环境变

量的path,这样在cmd下就可以使⽤了,和Linux下使⽤svn的习惯⼀样了。

step2

配置环境变量

安装⽬录Apache-Subversionbin

File⽂件

这个⽂件主要是递归删除从仓库拉取下来的模板中的隐藏⽂件.svn/.git

constfs=require('fs');

/**

*寻找.svn⽂件,删除svn关联

*

*@param{*}pathStr

*/

functiondeleteFolder(pathStr,fileName){

letfiles=[];

if(Sync(pathStr)){

files=rSync(pathStr,'utf8');

h(function(file,index){

letcurPath=pathStr+'/'+file;

//匹配特定SVN⽂件夹,然后移除

if(newRegExp(`^${fileName}$`).test(file)){

deleteFile(curPath);

}

});

}

}

/**

*删除svn⽂件夹与⽂件

*

*@param{*}pathStr

*/

functiondeleteFile(pathStr){

letfiles=[];

if(Sync(pathStr)){

files=rSync(pathStr,'utf8');

h(function(file,index){

letcurPath=pathStr+'/'+file;

if(nc(curPath).isDirectory()){

deleteFile(curPath);

}else{

Sync(curPath);

}

});

ync(pathStr);

}

}

s=deleteFolder;

命令

create命令也⼀样,只是拉取的模板不同⽽已,所以直接上代码

constprogram=require('commander');

constchalk=require('chalk');

constinitGit=require('./work-cli-git');

constora=require('ora');

constdeleteFolder=require('./common/deleteFile');

('');

();

if(<1){

();

}

constpageName=[0];

if(!pageName){

(('nPageNameshouldnotbeemptyn'));

return;

}

(('nStartgenerating...n'));

//加载图标

constspinner=ora('Downloading...');

();

constrepository='direct:/huhaiqing106/';

initGit(repository,pageName).then((err)=>{

d();

if(err){

(('nCopybusinesspagetemplateexception'));

(`n${err}`);

}else{

try{

deleteFolder('./'+pageName,'.git');

}catch(error){

(('nDelete'+fileName+'folderexception,butdoesnotaffectoperation'));

}

(('nGenerationcompleted!'));

}

});

5.发布npm

⾄此⼀个简易的脚⼿架已经搭建好了,本地我们可以通过npmlink挂载到全局测试,测试通过之后,我们在发布到npm私服,然后通过npm

installxxx-g将依赖安装到全局之后,就可以开⼼的玩耍了

6.资料⽂件

第⼀次记录写⽂章,⽂笔有限,多多包涵,ヾ(´ー`)

👁️ 阅读量:0