首先抛出一个问题,你们在使用webpack,webpack-dev-server,babel-cli,vue-cli,npm这类工具的时候有没有思考过一个问题?为何我全局安装这个模块以后,就能在shell中使用webpack,babel这些命令?vue
因而我在shell中敲击webpack命令,系统就会在环境变量中查找webpack,而后执行link file指向的webpack bin目录下的webpack.js 文件。接着就能够顺利的执行webpack相关的功能,编译打包静态文件........node
那么让咱们开始用node写一个CLI工具!!!webpack
很简单,到npmjs注册一个帐号,注册好以后,到你的项目下git
执行 npm login
,按提示操做便可github
接着 npm publish
,进入你想要发布的包下,执行该命令便可web
不出意外,就成功发布了一个npm包vue-cli
重点就是,package.json,bin配置能够将开发者但愿执行的脚本注册到环境变量,顺便把个人脚手架的项目结构po出来,源码: https://github.com/zhentaoo/p...shell
在执行 npm install -g poke-ball
以后,就能在环境变量中找到link file kk
如图:
此时当我在shell中敲击kk的时候,就会执行对应的kk文件,因而就有了接下来的一系列操做.npm
在写脚手架工具中,容易混乱的一个问题就是路径,由于操做文件的过程当中,你可能须要把CLI中的模版文件复制到当前项目中。所以就出现了2个路径
分别是json
process.cwd() 当前工做目录,也就是你的当前项目的路径。
__dirname 是执行的源文件的所在路径,也就是bin文件所在的path,也就是脚手架中的源文件路径。
seed若是和CLI集成在一块儿,假如seed须要升级,那么CLI也不得不升级,全部使用方都不得不从新安装CLI。能够把二者拆开。
CLI在new一个seed的时候,使用 git clone,但若是seed版本过多,seed的git仓库势必很大.使用git clone --depth 1,只clone最新版本会是个不错的方案.以后在rm -rf .git