1.0.6 • Published 2 years ago

eno-cli v1.0.6

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

搭建脚手架

一、创建指令

commander文档:https://github.com/tj/commander.js/blob/HEAD/Readme_zh-CN.md

为简化使用,Commander 提供了一个全局对象:

const { program } = require("commander")

配置命令使用.command()或者.addCommand()

.command参数:

第一个参数:命令名称

第二个参数:命令参数 必选参数使用<>,可选参数使用[]

例如:

program
  .command('create <project> [destination]') //命令名
  .description('clone a repository into a newly created directory') //命令描述
  .action(createProjectTemplate);//命令执行函数,传入参数project, destination
1.1 下载模板执行函数

下载目标模板,使用download-git-repo,下载一个git仓库到目标文件夹,并带选项和回调

const download = require('download-git-repo')

第一个参数:git地址 ,地址前需要加上direct:,例如direct:url

第二个参数:目标文件名

第三个参数:下载参数

clone:默认false,及下载项目,true,使用 git clone克隆项目

第四个参数:callback,执行错误的回调函数

1.2 util.promisify

此方法可将有回调函数的方法转化为 promise格式进行调用,因为我们需要在执行完下载指令之后执行其他指令,所以将下载方法promise化

const {promisify} = require('util')
const download = promisify(require('download-git-repo'))
1.3下载依赖包

下载依赖包,需要node打开一个额外的进程,node的核心模块 child_process中的spwan方法可以执行命令并开启一个新的进程。

该方法接收3个参数:

第一个参数:command 要运行的命令,npm或者yarn

第二个参数:字符串参数列表,如果你要执行 npm install命令,那么该数组就是 ['install']。如果你要执行 npm install axios,那么这个数组就应该为 ['install', 'axios']

第三个参数:是一个配置对象,常用的是cwd,子进程的当前工作目录

1.3.1 开启一个进的进程
const { spawn } = require("child_process")

const spawnChildProcess = (...args) => {
  return new Promise((resolve) => {
    const childProcess = spawn(...args)
    childProcess.stdout.pipe(process.stdout) // 子进程的输出 pipe 给父进程的输出
    /**
	或者通过监听 data 事件来获取结果
	childProcess.stdout.on('data', (data) => {
      		// console.log(data);
    	});
    */
    childProcess.on('close', () => {
      resolve() 
      console.log("子进程关闭");
  
    })
  })
}
1.3.2 下载依赖包

注意:在执行npm(yarn)时,windows系统会将转化为为npm.cmd(yarn.cmd),但是,在linux和Mac系统上,是没有这个转化的,process.platform可以判断当前的操作系统,os.platform方法也可以

const createProjectTemplate= async (project) => {
  try {
    //1.克隆项目
    await download('direct:git地址', project, { clone: true }) 

    // 2. 执行npm install命令安装依赖
    const command = process.platform === 'win32' ? 'npm.cmd' : 'npm'
  
    await spawnChildProcess (command, ['install'], { cwd: `./${project}` })

    //3.安装完成提示
    console.log(chalk.blue(`$ cd ${project}`))
    console.log(chalk.blue(`$ npm run serve`))

  } catch (err) {
    console.log(err);
  }
}
1.4 操作提示

依赖包下载完成后,提示进入目标文件并执行项目

变色文字使用chalk包

  //3.安装完成提示
    console.log(chalk.blue(`$ cd ${project}`))
    console.log(chalk.blue(`$ npm run serve`))

二、解析指令

.parse(),解析指令

第一个参数:需要解析的字符串数组,也可以省略使用process.argv

第二个参数:如果参数遵守约定不同于node,可传递from选项指定遵循的脚本

  • node: 默认值,argv[0]是应用,argv[1]是要跑的脚本,后续为用户参数
  • electron:argv[1]根据 electron 应用是否打包而变化
  • user:来自用户的所有参数
program.parse(process.argv); // 指明,按 node 约定
program.parse(); // 默认,自动识别 electron
program.parse(['-f', 'filename'], { from: 'user' })
program
  .command('create <project> [destination]') //命令名
  .description('clone a repository into a newly created directory') //命令描述
  .action(createProjectAction);
program.parse(process.argv)
1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago