node编写cli命令行(二)

该文章是在 node编写cli命令行(一) 的基础上继续编写的

1.编写 create 指令

编写一个新建vue项目的 create 指令,例如当执行:vue-temp-cli create myVue 时,会新建一个项目名称为myVue 的 Vue 项目

1.编写 create 指令

1.修改index.js文件

在第3步添加新建项目的 create 指令

#!/usr/bin/env node
console.log('vue-temp-cli')
var program = require('commander');
// 1.添加版本
program.version(require('./package.json').version,  '-v, --version')

// 2.添加 options 选项(可供后面定义的指令使用该选项,获取选项的属性 program.xxx )
program
  .option('-i, --integer <n>', 'An integer argument')

// 3.添加新建项目的 create 指令。例如:vue-temp-cli create xxx
program
  .command('create <project> [otherArg...]')
  .description('clone a repository into a newly created project or directory')
  .action(function (project, otherArg) {
    // vue-temp-cli create myVue a b
    console.log('vue-temp-cli', project, otherArg.join(' '));
  });
  
// 4.添加help提示信息
program.on('--help', function(){
  console.log('')
  console.log('Other:');
  console.log('  $ vue-temp-cli --help');
  console.log('  $ vue-temp-cli -h');
  console.log('  $ vue-temp-cli -v');
  console.log('  $ vue-temp-cli --version');
  console.log('  $ vue-temp-cli -i 1');
  console.log('  $ vue-temp-cli --interger 1');
  console.log('  $ vue-temp-cli create myVue');
});
program.parse(process.argv);

2.执行 vue-temp-cli create myVue a b 命令

PS F:\blog\node-cli\vue-temp-cli> vue-temp-cli create myVue a b
vue-temp-cli
vue-temp-cli myVue a b
PS F:\blog\node-cli\vue-temp-cli>

2.美化欢迎界面

1.安装 figlet , clear 和

figlet 工具可以将 message 转化为空心的字体

clear 清空终端的屏幕

chalk是一个颜色的插件,可以修改终端字体颜色

PS F:\blog\node-cli\vue-temp-cli> npm install figlet
npm WARN vue-temp-cli@1.0.0 No description
npm WARN vue-temp-cli@1.0.0 No repository field.
+ figlet@1.4.0
added 1 package from 1 contributor in 1.276s

PS F:\blog\node-cli\vue-temp-cli> npm install clear        
npm WARN vue-temp-cli@1.0.0 No description
npm WARN vue-temp-cli@1.0.0 No repository field.
+ clear@0.1.0
added 1 package from 1 contributor in 0.848s

PS F:\blog\node-cli\vue-temp-cli> npm install chalk
npm WARN vue-temp-cli@1.0.0 No description
npm WARN vue-temp-cli@1.0.0 No repository field.
+ chalk@4.0.0
added 7 packages from 4 contributors in 1.257s
PS F:\blog\node-cli\vue-temp-cli> 

2.在lib文件夹下新建 utils.js 文件

新建 utils.js

`-- vue-temp-cli
    |-- lib
        |-- utils.js
    `-- index.js

utils.js 文件内容如下,编写了一个打印欢迎界面的函数,并导出

// Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
const { promisify } = require('util')
// figlet 工具可以将 message 转化为空心的字体
const figlet = promisify(require('figlet'))
// clear 清空终端的屏幕
const clear = require('clear')

// 打印欢迎界面
const printWelcome = async (str)=>{
  clear()
  const welcome = await figlet(str)
  console.log(welcome)
}


module.exports = {
  printWelcome
}

3.在index.js文件引入 utils.js文件

调用 utils的printWelcome函数打印欢迎界面

#!/usr/bin/env node

const utils = require('./lib/utils')
var program = require('commander');
utils.printWelcome('welcome  CLI')
// 1.添加版本
program.version(require('./package.json').version,  '-v, --version')

// 2.添加options
....
// 3.添加create指令
program
  .command('create <project> [otherArg...]')
  .action(function (project, otherArg) {
    // vue-temp-cli create myVue a b
    // console.log('vue-temp-cli', project, otherArg.join(' '));
  });
  
// 4.添加help提示信息
....
program.parse(process.argv);

4.执行 vue-temp-cli create myVue 命令

PS F:\blog\node-cli\vue-temp-cli> vue-temp-cli create myVue
               _                              ____ _     ___
 __      _____| | ___ ___  _ __ ___   ___    / ___| |   |_ _|
 \ \ /\ / / _ \ |/ __/ _ \| '_ ` _ \ / _ \  | |   | |    | |
  \ V  V /  __/ | (_| (_) | | | | | |  __/  | |___| |___ | |
   \_/\_/ \___|_|\___\___/|_| |_| |_|\___|   \____|_____|___|

PS F:\blog\node-cli\vue-temp-cli>

5.修改字体颜色

直接修改utils.js文件,添加一个log函数,打印绿色的字体

修改完后重新执行 vue-temp-cli create myVue 命令,终端控制台就会打印 绿色的欢迎界面的字体

// Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
const { promisify } = require('util')
// figlet 工具可以将 message 转化为空心的字体
const figlet = promisify(require('figlet'))
// clear 清空终端的屏幕
const clear = require('clear')
// chalk是一个颜色的插件,可以修改终端字体颜色
const chalk = require('chalk')

// 输出绿色字体
const log = (str)=>{
  console.log(chalk.green(str))
}

// 打印欢迎界面
const printWelcome = async (str)=>{
  clear()
  const welcome = await figlet(str)
  // 输出绿色字体
  log(welcome)
}


module.exports = {
  printWelcome
}

3.克隆模板项目

1.安装 download-git-repo , ora 库

download-git-repo 用来 clone Github GitLab仓库项目的node库;

ora 一个优雅的 Node.js 终端加载动画效果;

PS F:\blog\node-cli\vue-temp-cli> npm install download-git-repo
npm WARN vue-temp-cli@1.0.0 No description
npm WARN vue-temp-cli@1.0.0 No repository field.
+ download-git-repo@3.0.2
added 124 packages from 46 contributors in 11.594s


PS F:\blog\node-cli\vue-temp-cli> npm install ora
npm WARN vue-temp-cli@1.0.0 No description
npm WARN vue-temp-cli@1.0.0 No repository field.
+ ora@4.0.4
added 22 packages from 25 contributors in 2.494s
PS F:\blog\node-cli\vue-temp-cli>

2.在utils.js中编写克隆模板项目的代码

1)导入download-git-repo 库的

2)调用 download-git-repo 该库的 download 方法

// Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
const { promisify } = require('util')
// figlet 工具可以将 message 转化为空心的字体
const figlet = promisify(require('figlet'))
// clear 清空终端的屏幕
const clear = require('clear')
// chalk是一个颜色的插件,可以修改终端字体颜色
const chalk = require('chalk')

const log = (str)=>{
  console.log(chalk.green(str))
}

// 1.打印欢迎界面
......

// 2.克隆模板项目(Download a git `repository` to a `destination` folder  with `options`  )
const cloneProject = async (repository, destination, options)=>{
  const download = promisify(require('download-git-repo'))
  // 进度条
  const ora = require('ora')
  const process = ora(`git clone ${repository} .....`)
  process.start()
  // clone
  await download(repository, destination, options ? options : { clone: false })
  // 关闭进度条
  process.succeed()
}

module.exports = {
  printWelcome,
  cloneProject,
  log
}

3.在lib文件夹新建create.js文件

`-- vue-temp-cli
    |-- lib
        |-- create.js
        |-- utils.js
    `-- index.js

create.js文件对应的内容如下:

该文件是create指令具体代码的实现

1)打印欢迎界面

2)自动克隆模板

3)自动安装依赖

4)自动打开浏览器

5)自动运行项目

const utils = require('./utils')
/**
 * 初始化项目
 * @param {*} projectName  新建项目的名称
 * @param {*} otherArg  其它参数
 */
const initProject =async (projectName, otherArg)=>{
  // 1.打印欢迎界面
  await utils.printWelcome('HYZS WEB CLI')
  console.log(`🚀新建项目:${projectName}`)
  // 2.自动克隆模板
  await utils.cloneProject('direct:http://12.16.120.120/25759/vue-pro-temp.git#admin-app', projectName, { clone: true })

  // 3.自动安装依赖

  // 4.自动打开浏览器

  // 5.自动运行项目
   

  // https://github.com/LiuJunb/testweb  public ok
  // await utils.cloneProject('github:LiuJunb/testweb', project)
  
  // need add {clone:true}
  // await utils.cloneProject('direct:https://github.com/LiuJunb/testweb.git', project,{ clone: true })

  // 不能使用ip
  // await utils.cloneProject('gitlab:12.16.120.120:25759/vue-pro-temp', project)
    
  // ok
  // await utils.cloneProject('direct:http://12.16.120.120/25759/vue-pro-temp.git#admin-app', project, { clone: true })
    
}
module.exports = {
  initProject
}

注意:该测试案例的github仓库地址是public

5.在index.js文件中调用create.js中初始化项目的函数

var create = require(’./lib/create’)

create.initProject

#!/usr/bin/env node
var create = require('./lib/create')
var program = require('commander');
// 1.添加版本
program.version(require('./package.json').version,  '-v, --version')

// 2.添加options
....
// 3.添加create指令
program
  .command('create <project> [otherArg...]')
  .action(create.initProject);
  
// 4.添加help提示信息
....
program.parse(process.argv);

6.打开任意终端执行 vue-temp-cli create myVue 命令

PS F:\blog\node-cli>vue-temp-cli  create myVue
               _                              ____ _     ___ 
 __      _____| | ___ ___  _ __ ___   ___    / ___| |   |_ _|
 \ \ /\ / / _ \ |/ __/ _ \| '_ ` _ \ / _ \  | |   | |    | | 
  \ V  V /  __/ | (_| (_) | | | | | |  __/  | |___| |___ | | 
   \_/\_/ \___|_|\___\___/|_| |_| |_|\___|   \____|_____|___|

��新建项目目:myVue
√ git clone direct:http://12.16.120.120/25759/vue-pro-temp.git#admin-app .....
PS F:\blog\node-cli>

执行完之后,会在执行该命令的目录下新建一个 myVue 项目,并 把远程仓库的代码clone下来了

4.自动安装依赖

1.在utils.js中编写执行终端命令的子线程

// Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
const { promisify } = require('util')
// figlet 工具可以将 message 转化为空心的字体
const figlet = promisify(require('figlet'))
// clear 清空终端的屏幕
const clear = require('clear')
// chalk是一个颜色的插件,可以修改终端字体颜色
const chalk = require('chalk')

const log = (str)=>{
  console.log(chalk.green(str))
}

// 1.打印欢迎界面
.....

// 2.克隆模板项目(Download a git `repository` to a `destination` folder  with `options`  )
......

/**
 * 4.获取可以 执行终端命令的 子线程
 * @param  {...any} args  ['npm', ['install'], {cwd:'./myVue'}]
 * 参数说明:命令   参数   执行的目录
 *      ['npm', ['install'], {cwd:'./myVue'}]
 *		['npm', ['run', 'serve'], {cwd:'./myVue'}]
 */
const terminal = async (...args) =>{
  const {spawn} = require('child_process')
  return new Promise((resolve)=>{
    // 子线程
    const proc = spawn(...args)
    // console.log('proc=',proc)
    // 子线程 proc --终端的输出转到--> 主线程 process
    proc.stdout.pipe(process.stdout)
    proc.stderr.pipe(process.stderr)
    proc.on('close', ()=>{
      resolve()
    })
  })
}

module.exports = {
  printWelcome,
  cloneProject,
  log,
  terminal
}

2.在create.js中调用 terminal 函数来执行终端命令

const utils = require('./utils')

/**
 * 初始化项目
 * @param {*} projectName  新建项目的名称
 * @param {*} otherArg  其它参数
 */
const initProject =async (projectName, otherArg)=>{
  // 1.欢迎界面
  await utils.printWelcome('HYZS WEB CLI')
  console.log(`🚀🚀新建项目:${projectName}`)
  // 2.克隆模板
  // await utils.cloneProject(
  //   'direct:http://172.16.120.120/25759/vue-pro-temp.git#admin-app',
  //   projectName,
  //   { clone: true }
  // )

  // 3.安装依赖
  utils.log(
`🚀🚀npm install  安装依赖...`
  )
  // 这个种写法在window电脑下回报错
  // await utils.terminal('npm', ['install'], {cwd: `./${projectName}`})
  const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'
  await utils.terminal(npm, ['install'], {cwd: `./${projectName}`})
  utils.log(
`🚀🚀依赖安装完毕...`
  )
  // 4.打开浏览器

  // 5.运行项目
}
module.exports = {
  initProject
}

3.执行 vue-temp-cli create myVue

执行该指令之后,就会给新建的项目自动执行 npm install

相当于执行了: cd myVue && npm install

5.自动打开浏览器

1.安装 open 依赖

open 库可以自动打开浏览器

PS F:\blog\node-cli\vue-temp-cli> npm install open
npm WARN vue-temp-cli@1.0.0 No description
npm WARN vue-temp-cli@1.0.0 No repository field.

+ open@7.0.4
added 3 packages from 1 contributor in 1.835s

2.编写代码

const utils = require('./utils')
const open = require('open')
/**
 * 初始化项目
 * @param {*} projectName  新建项目的名称
 * @param {*} otherArg  其它参数
 */
const initProject =async (projectName, otherArg)=>{
  // 1.欢迎界面
  await utils.printWelcome('HYZS WEB CLI')
  utils.log(`🚀🚀New Vue Project Name:${projectName}`)
  // 2.克隆模板
  ....

  // 3.安装依赖
  ....
  // 4.打开浏览器
  open('http://localhost:8080')  
  // 5.运行项目

}
module.exports = {
  initProject
}

3.测试

执行 vue-temp-cli create myVue 后会自动打开浏览器

6.自动运行项目

1.编写create.js

添加 自动运行项目 代码

const utils = require('./utils')
const open = require('open')
/**
 * 初始化项目
 * @param {*} projectName  新建项目的名称
 * @param {*} otherArg  其它参数
 */
const initProject =async (projectName, otherArg)=>{
  // 1.欢迎界面
  await utils.printWelcome('HYZS WEB CLI')
  utils.log(`🚀🚀New Vue Project Name:${projectName}`)
    
  // 2.克隆模板
  .....	
  
  // 3.安装依赖
  utils.log(`🚀🚀npm install 安装依赖...`)
  // 进度条
  const ora = require('ora')
  const pro = ora(`git clone ${repository} .....`)
  pro.start()
  // 这个种写法在window电脑下回报错
  // await utils.terminal('npm', ['install'], {cwd: `./${projectName}`})
  const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'
  await utils.terminal(npm, ['install'], {cwd: `./${projectName}`})
  // 关闭进度条
  pro.succeed()
  utils.log(`🚀🚀finish 依赖安装完毕...`)
    
  // 4.自动打开浏览器
  open('http://localhost:8080')  
    
  // 5.自动运行项目
  await utils.terminal(npm, ['run', 'serve'], {cwd: `./${projectName}`})
    
}
module.exports = {
  initProject
}

相当于执行:cd myVue && npm run serve

2.测试

执行 vue-temp-cli create myVue 后会自动运行项目

2.发布vue-temp-cli到npm

npm config set registry http://registry.npmjs.org
npm login
npm publish
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将一个Node脚本配置成命令行工具,你可以按照以下步骤操作: 1. 在你的项目根目录中创建一个新的文件夹,例如 `bin`,用于存放命令行工具的代码。 2. 在 `bin` 文件夹中创建一个新的文件,例如 `cli.js`,作为你的命令行工具的入口文件。 3. 在 `cli.js` 文件的开头添加 `#!/usr/bin/env node`,这是告诉操作系统使用Node来执行脚本的指令。 例如: ```javascript #!/usr/bin/env node // 命令行工具的代码 ``` 4. 在 `cli.js` 文件中编写你的命令行工具的代码。你可以使用`process.argv`来获取命令行参数,以及使用Node的模块和功能来完成你的逻辑。 例如: ```javascript #!/usr/bin/env node const args = process.argv.slice(2); // 你的命令行工具的逻辑 console.log('Hello, World!'); console.log('命令行参数:', args); ``` 5. 在 `package.json` 文件中的 `scripts` 字段中添加一个自定义的脚本命令,例如 `cli`,并指向你的入口文件。 例如: ```json { "name": "your-project", "version": "1.0.0", "scripts": { "cli": "node bin/cli.js" } } ``` 6. 最后,在命令行中运行 `npm link`,这将会在全局范围内创建一个符号链接,使你的命令行工具可以在任何地方使用。 例如: ``` npm link ``` 现在,你就可以在命令行中运行你的命令行工具了,使用以下命令: ``` your-project-cli [命令行参数] ``` 注意替换 `your-project-cli` 为你自己的命令行工具的名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值