node命令行工具之实现项目工程自动初始化的标准流程

一、目的

传统的前端项目初始流程一般是这样:

可以看出,传统的初始化步骤,花费的时间并不少。而且,人工操作的情况下,总有改漏的情况出现。这个缺点有时很致命。

甚至有马大哈,没有更新项目仓库地址,导致提交代码到旧仓库,这就很尴尬了。。。
基于这些情况,编写命令行工具(CLI)的目的就很明确:

用于新项目工程的初始化利用工具进行初始化,可以节省项目初期的准备时间避免出现改漏的情况杜绝未更新项目版本仓库地址的问题

以下是新的流程示意图:

二、自动化流程分析

以下是自动化流程图:

从流程图可以得出两个重要的信息:

配置信息模板文件

命令行工具的角色,是负责将两个信息进行融合,提供一个交互平台给用户。

三、工具准备

3.1 配置信息工具

配置信息的获得,需要靠和用户进行交互。由于程序员一般是用终端输入命令进行项目操作。所以,这里选择了两个工具进行支撑。

commander

借鉴Ruby commander理念实现的命令行执行补全解决方案

commander可以接收命令行传入的参数

例子:

npg-cli --help
♫ ♫♬♪♫ npm-package-cli ♫ ♫♬♪♫
Usage: npg-cli [options]
Options:
 -V, --version output the version number
 -h, --help   output usage information
 run testcli and edit the setting.

inquirer

常用交互式命令行用户界面的集合。

inquirer用询问式的语句,与用户进行交互,接收参数

例子:

npg-cli
♫ ♫♬♪♫ npm-package-cli ♫ ♫♬♪♫
Follow the prompts to complete the project configuration.
? project name test
? version 1.0.0
? description

3.2 模板信息工具

前端的JavaScript 模板引擎,比如ejs,jade等。可以根据传入的参数,对模板标签进行替换,最终生成html。

如果把所有项目文件,不管文件后缀名,都看成是ejs模板,则可以在文件内容中使用ejs语法。
再根据配置信息进行替换,最终生成新文件。

其实,业界依据这个想法,已经有成熟的工具产生。

mem-fs

mem-fs是对文件进行读取,存入内存中。

mem-fs-editor

mem-fs-editor是对内存中的文件信息,使用ejs语法进行编译。最后调用commit方法输出最终文件。

3.3 提示信息工具

提示信息,除了console.log,还可以使用色彩更丰富的chalk
这样,可以输出更直观、友好的提示。

3.4 文件操作

文件操作,有业界成熟的shelljs
利用shelljs,可以在项目中简化以下步骤:

一些项目文件,不需要修改,只用直接copy。可以使用shelljs.copySync同步方式生成。一些文件夹,需要提前构建,可以使用shelljs.mkdir进行创建

四、实现

以下按我做的开源项目——npm-package-cli的创作过程进行分拆、讲解。

4.1 初始化

新建项目文件夹npm-package-cli,并在该文件夹下运行npm init,生成package.json
项目结构如下:

 npm-package-cli
    |-- package.json

4.2 生成全局指令

这里要生成的全局指令是npg-cli

4.2.1 新建执行文件

新建文件夹bin,并在文件夹下新建名称为cli的shell脚本文件(注意:不能有后缀名)。
clishell脚本文件内容如下:

#!/usr/bin/env node
console.log('hello world');

其中,#!/usr/bin/env node是告诉编译器,以node的方式,运行代码。

并在package.json加入以下内容:

"bin": {
  "npg-cli": "bin/cli"
}

此时,项目结构如下:

 npm-package-cli
    |-- bin
      |-- cli
    |-- package.json

4.2.2 链接指令到全局

链接指令有两种方式:

npm link

npm install -g

两种方式,都需要在npm-package-cli文件夹下运行,才能生效。
作用是把npg-cli指令,指向全局的bin文件下,实现软链。

4.2.3 运行

在任意文件夹下运行命令:

npg-cli

# 输出
hello world

到这里,一个基本的指令就算完成了,接下来是指令的工作内容细化。

4.3 初始化操作类Creation

Creation的作用是整合所有操作,并提供接口给指令文件cli
Creation的结构如下:

class Creation{
 constructor(){
  // code
 }
 do(){
   // code
 }
 // other function
}

其中do方法暴露给脚本文件cli调用。

Creation类放在src/index.js中。

此时,项目结构如下:

 npm-package-cli
    |-- bin
      |-- cli
    |-- src
      |-- index.js
    |-- package.json

4.4 修改cli文件

#!/usr/bin/env node
const Creator = require('../src/index.js');
const project = new Creator();
project.do();

这样,只要实现好do方法,就可以完成npg-cli指令的运行了。

4.5 实现命令行参数读取

实现npg-cli --help,需要借助上文提到的工具commander
新建src/command.js文件,文件内容如下:

const commander = require('commander');
const chalk = require('chalk');
const packageJson = require('../package.json');
const log = console.log;
function initCommand(){
  commander.version(packageJson.version)
    .on('--help', ()=>{
      log(chalk.green(' run testcli and edit the setting.'));
    })
    .parse(process.argv);
}
module.exports = initCommand;

此时,项目结构如下:

 npm-package-cli
    |-- bin
      |-- cli
    |-- src
      |-- command.js
      |-- index.js
    |-- package.json

然后在Creation.do方法内执行initCommand()即可生效。

// src/index.js Creation
const initCommand = require('./command');

class Creation{
  // other code
  do(){
    initCommand();
  }
}

此时,运行npg-cli --help指令,就可以看到:

Usage: npg-cli [options]

Options:
 -V, --version output the version number
 -h, --help   output usage information
 run testcli and edit the setting.

4.6 获取用户输入配置信息

要获取用户输入的信息,需要借助工具inquirer
新建src/setting.js文件,文件内容如下:

const inquirer = require('inquirer');
const fse = require('fs-extra');

function initSetting(){
  let prompt = [
    {
      type: 'input',
      name: 'projectName',
      message: 'project name',
      validate(input){
        if(!input){
          return 'project name is required.'
        }
        if(fse.existsSync(input)){
          return 'project name of folder is exist.'
        }
        return true;
      }
    },
    // other prompt
  ];

  return inquirer.prompt(prompt);
}

module.exports = initSetting;

此时,项目结构如下:

 npm-package-cli
    |-- bin
      |-- cli
    |-- src
      |-- command.js
      |-- index.js
      |-- setting.js
    |-- package.json

然后在Creation.do方法内执行initSetting()即可生效。

// src/index.js Creation
const initCommand = require('./command');
const initSetting = require('./setting');

class Creation{
  // other code
  do(){
    initCommand();
    initSetting().then(setting => {
      // 用户输入完成后,会得到全部输入信息的json数据 setting
    });
  }
}

这里,inquirer.prompt方法装载好要收集的问题后,返回的是Promise对象。收集完成之后,要在then方法内拿到配置信息,以便进行下一步模板替换的操作。

4.7 模板文件替换输出

模板文件替换,要用到工具mem-fsmem-fs-editor
文件操作,要用到工具shelljs

新建src/output.js文件,文件内容如下(删除了部分代码,以下只是示例,完整项目看最后分享链接):

const chalk = require('chalk');
const fse = require('fs-extra');
const path = require('path');
const log = console.log;

function output(creation){
  return new Promise((resolve, reject)=>{
    // 拿到配置信息
    const setting = creation._setting;
    const {
      projectName
    } = setting;
    // 获取当前命令行执行环境所在文件夹
    const cwd = process.cwd();

    // 初始化文件夹path
    const projectPath = path.join(cwd, projectName);
    const projectResolve = getProjectResolve(projectPath);

    // 新建项目文件夹
    fse.mkdirSync(projectPath);

    // copy文件夹
    creation.copy('src', projectResolve('src'));
    // 根据配置信息,替换文件内容
    creation.copyTpl('package.json', projectResolve('package.json'), setting);

    // 将内存中的文件,输出到硬盘上
    creation._mfs.commit(() => {
      resolve();
    });
  });
}

module.exports = output;

output方法的作用:

  • 新建项目文件夹
  • 把模板文件读取出来,根据配置信息,进行替换(调用的是mem-fs-editor的copyTpl方法)
  • 拷贝其他文件
  • 输出最终文件到硬盘上

这里最重要的一步,是调用mem-fs-editor的方法后,要执行mem-fs-editorcommit方法,输出内存中的文件到硬盘上。

在Creation.do方法中,调用output方法即可输出新项目文件。
打开src/index.js文件,文件内容增加如下方法:

// src/index.js Creation
const initCommand = require('./command');
const initSetting = require('./setting');
const output = require('./output');

class Creation{
  // other code
  do(){
    initCommand();
    initSetting().then(setting => {
      // 用户输入完成后,会得到全部输入信息的json数据 setting
      this._setting = Object.assign({}, this._setting, setting);
      // 输出文件
      output(this).then(res => {
        // 项目输出完成
      });
    });
  }
}

4.8 阶段小结

自动初始化一个项目的流程不外乎以下三点:

  • 读取用户配置
  • 读取模板文件
  • 根据配置,编译模板文件,输出最终文件

命令行工具,是对这三点的有效整合,串连成一个规范的流程。

五、发布npm包的注意点

命令行工具中,使用的第三方工具包,都需要用--save的方式安装。
体现在package.json的表现是dependencies字段:

"dependencies": {
  "chalk": "^2.4.2",
  "commander": "^3.0.0",
  "fs-extra": "^8.1.0",
  "inquirer": "^6.5.0",
  "mem-fs": "^1.1.3",
  "mem-fs-editor": "^6.0.0",
  "shelljs": "^0.8.3"
},

这样,其他用户在安装你发布的CLI工具时,才会自动安装这些依赖。

六、项目开源

我创作的npm-package-cli,是专门用于生成个人npm package项目的CLI工具。
生成的项目,囊括以下功能点:

  • 支持TypeScrpt
  • mocha+chai自动化测试,支持使用TypeScript编写测试用例支持测试覆盖率
  • coverage支持eslint,包括对TypeScript的lint检查
  • Git commit规范提交
  • Git版本自动打标签(standard-version),更新CHANGELOG.md
  • 输出的npm包

支持各种模块规范(AMD、CMD、CommonJS、ESModule)

CLI工具安装方式:

npm install -g npm-package-cli

开源仓库地址:https://github.com/wall-wxk/npm-package-cli

如果对你有所帮助,麻烦给个Star,你的肯定是我前进的动力~

总结

以上所述是小编给大家介绍的node命令行工具之实现项目工程自动初始化的标准流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • nodejs中用npm初始化来创建package.json的实例讲解

    1.先正确的安装nodejs这个软件,自己去百度一下,安装很简单 2.然后在安装的NodeJS目录下打开cmd,在里面输入命令npm init,会得到如下图所示: 3.按提示,一步步来完成项目文件的配置,没有的可以不写,直接enter,这样初始化时会创建默认的文件,最后创建完的目录如下所示: 4.完后输入yes或Y来对配置文件进行设置,这样在目录下就会生成这样一个package.json文件,如下图中所示: 5.打开package.json这个文件,可以看见我们对这个工程的配置文件信息,如下图中

  • nodejs初始化init的示例代码

    打开cmd创建即可 $ npm init Package name: (hello) //模块名字,npm init会自动取当前目录名作为默认名字,这里不需要改,直接确认即可 Description: A example for write a module //模块说明 Package version: (0.0.0) 0.0.1 //模块版本号,这个大家按自己习惯来定就可以 Project homepage: (none) //模块的主页,如果有的话可以填在这里,也可以不填 Project

  • Node.js 使用命令行工具检查更新

    随着 Node.js 的"走红",使用 Node.js 开发命令行工具越来越简单.一个成熟的命令行工具应该从一开始就要考虑好之后的版本更新如何"优雅"的告知用户.最好的方法当然是当用户在终端执行命令时,将相关信息提示给用户. 这篇文章将给出一个易用.高效.可定制的方法.源码在这里: GITHUB ,欢迎大家顺手点赞.接下来我将讲解其实现思路. 使用 我们先简单看看这个 npm 包的使用方法: const updater = require('pkg-updater'

  • 详解用Node.js写一个简单的命令行工具

    本文介绍了用Node.js写一个简单的命令行工具,分享给大家,具体如下: 操作系统需要为Linux 1. 目标 在命令行输入自己写的命令,完成目标任务 命令行要求全局有效 命令行要求可以删除 命令行作用,生成一个文件,显示当前的日期 2. 代码部分 新建一个文件,命名为sherryFile 文件sherryFile的内容 介绍: 生成一个文件,文件内容为当前日期和创建者 #! /usr/bin/env node console.log('command start'); const fs = r

  • 详解Node.js如何开发命令行工具

    前言 Node 给前端开发带来了很大的改变,促进了前端开发的自动化,我们可以简化开发工作,然后利用各种工具包生成生产环境.如运行sass src/sass/main.scss dist/css/main.css即可编译 Sass 文件. 在实际的开发过程中,我们可能会有自己的特定需求, 那么我们得学会如何创建一个Node命令行工具. hello world 老规矩第一个程序为hello world.在工程中新建bin目录,在该目录下创建名为helper的文件,具体内容如下: #!/usr/bin

  • 浅谈node.js 命令行工具(cli)

    一. 先了解一下package.json 每个项目的根目录都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息,下面是一个比较完整的package.json文件 { "name": "vue-cli", "version": "2.9.3", "description": "A simple CLI for scaffolding Vue.js projec

  • Nodejs 发布自己的npm包并制作成命令行工具的实例讲解

    <span style="font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);">近日当我在使用npm上已经存在的一个包时,发现它有bug:于是决定自己实现这个功能,自己写一个npm包.</span> 下面我记录一下自己的实现过程. 1. npm init 选择一个文件夹,然后用命令行cd进去,然后执行npm init,这时会生成一长串表单,根据自己的实际情况填写内

  • node命令行工具之实现项目工程自动初始化的标准流程

    一.目的 传统的前端项目初始流程一般是这样: 可以看出,传统的初始化步骤,花费的时间并不少.而且,人工操作的情况下,总有改漏的情况出现.这个缺点有时很致命. 甚至有马大哈,没有更新项目仓库地址,导致提交代码到旧仓库,这就很尴尬了... 基于这些情况,编写命令行工具(CLI)的目的就很明确: 用于新项目工程的初始化利用工具进行初始化,可以节省项目初期的准备时间避免出现改漏的情况杜绝未更新项目版本仓库地址的问题 以下是新的流程示意图: 二.自动化流程分析 以下是自动化流程图: 从流程图可以得出两个重

  • 使用命令行工具npm新创建一个vue项目的方法

    Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程. 只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于生产环境的构建配置的项目: # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project $ vue init webpack test //输入命令 ? Project

  • 如何制作一个Node命令行图像识别工具

    从 0 开始制作一个 NodeJS 命令行验证码识别工具.实现如下效果. 初始化项目 # 创建 recognition 项目 mkdir recognition cd recognition npm init -y # 安装主依赖 yarn add images tesseract.js # 安装工具依赖 yarn add chalk yargs # 可选依赖 yarn add socks5-http-client 依赖说明 images:Node.js 轻量级跨平台图像编码库,用于处理下载下来

  • Node.js中的package.json与cnpm命令行工具介绍

    一.包 Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理. 完全符合 CommonJs 规范的包目录一般包含如下这些文件. package.json :包描述文件. bin :用于存放可执行二进制文件的目录. lib :用于存放 JavaScript 代码的目录. doc :用于存放文档的目录. 在 NodeJs 中通过 NPM 命令来下载第三方的模块(包). http

  • 使用node打造自己的命令行工具方法教程

    一.实现一个简单的功能 二.环境 1.系统: window 10 2.编辑器: vscode 3.node版本: 8.7.0 三.开始玩 1.打开命令行,新建一个pa'ckage.json npm init 这时看到一个新的package.json生成了,使用编辑器打开 2.修改package.json,新增一个bin属性 { "name": "my-cli", "version": "1.0.0", "descri

  • Vue命令行工具Vue-CLI图文详解(推荐!)

    目录 阐述 vue全家桶 vue-cli Vue CLI 的安装 ① 默认安装 vue/cli 脚手架 3 ② 默认安装失败,解决mode版本问题 ③ nvm下载太慢问题解决 ④ 安装 Node ^12.0.0 ⑤ 从新安装 VueCli 脚手架 3 ④ 拉取 2.x 模板 (旧版本) ⑤ 安装vue指定版本 ⑥ 博主node版本 初始化项目 ① vue init命令讲解 ② 项目初始化 ③ 目录结构详解 ④ 运行项目 node 安装适合小白 1 去node官网下载 2 下载完成后双击安装包,跳

随机推荐