音乐分享:

钢心 - 《龙王》

初喜《冠军》后喜《龙王》

(PS:听一次钢心乐队的演出后采访才知道 “龙王”隐喻的是一起喝酒的老铁。。。。)

——————————————————————————————————————————————————————————————————————

项目截图:

项目地址:https://github.com/uustoboy/create-cli

项目目录:

├── bin
│ └── cf.js
├── lib
│ ├── class.js
│ └── templates
├── node_modules

└── package.json

第一步 主要靠Commander 命令行框架 和 inquirer 交互命令

cf.js代码:(主要命令的配置)

#!/usr/bin/env node
'use strict'; const program = require('commander');
const appInfo = require('./../package.json');
const _class = require('../lib/class.js');
const log = console.log; program
.version(appInfo.version)
.usage('创建简单前端项目! [options] <package>')
.parse(process.argv); program
.command('delete')
.alias('del')
.description('删除操作')
.action((cmd,option) => {
_class(cmd,option);
}) program
.command('app [cmd]')
.alias('a')
.description('创建app项目文件夹')
.option('-y, --fast', '快速创建默认目录')
.action((cmd,option) => {
_class(cmd,option);
}).on('--help', function() { // 图片文字 http://ascii.mastervb.net/text_to_ascii.php log(" ___ __ _ ");
log(" .' ..] [ | (_) ");
log(" .---. _| |_ ______ .---. | | __ ");
log(" / /'`\]'-| |-'|______|/ /'`\] | | [ | ");
log(" | \__. | | | \__. | | | | ");
log(" '.___.' [___] '.___.'[___][___] "); log();
log(' app 创建app项目文件夹');
log();
log(' -y, --fast 快速创建默认目录');
log();
}); program
.command('pc [cmd]')
.alias('p')
.description('创建pc项目文件夹')
.option('-y, --fast', '快速创建默认目录')
.action((cmd,option) => {
_class(cmd,option);
}).on('--help', function() { // 图片文字 http://ascii.mastervb.net/text_to_ascii.php log(" ___ __ _ ");
log(" .' ..] [ | (_) ");
log(" .---. _| |_ ______ .---. | | __ ");
log(" / /'`\]'-| |-'|______|/ /'`\] | | [ | ");
log(" | \__. | | | \__. | | | | ");
log(" '.___.' [___] '.___.'[___][___] "); log();
log(' pc 创建pc项目文件夹');
log();
log(' -y, --fast 快速创建默认目录'); log();
}); //默认不传参数输出help
if (!process.argv[2]) {
program.help();
} program.parse(process.argv);

class.js代码:(主要是处理交互命令执行)

'use strict';

const log = console.log;
const program = require('commander');
const Gitdownload = require('download-git-repo');
const download = require('download');
const path = require('path');
const fs = require('fs');
const inquirer = require('inquirer');
const fse = require('fs-extra');
const del = require('del');
const archiver = require('archiver');
const chalk = require('chalk');
const join = path.join; module.exports = function(cmd,option) { var promps = []; let _path = getPath( cmd ); if( option._name == 'delete' ){ if( !isFile( _path ) ){
return log(chalk.yellow(`${cmd}不存在`));
} promps.push({
type: 'confirm',
name: 'del',
message: '是否删除'+cmd
}); inquirer.prompt(promps).then(function (answers) { if( answers.del ){
del([ _path ])
.then( (err)=>{
//if(err) return log(chalk.red(err));
log(chalk.green('删除完成!~'));
});
} }); }else if( option._name == 'app' || option._name == 'pc' ){ if( isFile( _path ) ){
return log(chalk.yellow(`${cmd}已存在`));
} if( option.fast ){
var answers = {
base : false,
framework : false,
sass:true
}
createInfo( answers,cmd,option);
}else{
createFile(cmd,option);
} } }; //判断文件/文件夹是否存在;
var isFile = ( _path ) => fse.pathExistsSync( _path )?true:false;
var getPath = ( _path ) => path.resolve( process.cwd(),_path ); function createInfo( answers,cmd,option ){
fse.ensureDir(cmd)
.then(() => {
let jsStr = '';
log(chalk.green(`${cmd}文件夹创建~`)); fse.ensureDir( join(cmd,'c') ).then(() => { if( answers.base ){
let baseAs = join(__dirname,'..','lib/templates/',option._name,'base.css');
let baseBs = join(process.cwd(),cmd,'c','base.css'); fse.readFile(baseAs,'utf8').then(data=>{ var data = data; fs.writeFile(baseBs,data,function(){
log(chalk.green('base文件创建~'));
}) }); // fse.ensureLinkSync( join(__dirname,'..','lib/templates/',option._name,'base.css'), join(process.cwd(),cmd,'c','base.css') );
// log(chalk.green('base文件创建~'));
} }); fse.ensureDir( join(cmd,'j') ).then(() => {
//加载jquery.js;
if( answers.framework == 'jquery' ){
download('http://apps.bdimg.com/libs/jquery/1.8.3/jquery.min.js', path.join(cmd,'j') ).then(() => {
log(chalk.green('jquery文件创建~'));
});
jsStr = '<script src="j/jquery.min.js"></script>';
} //加载zepto.js;
if( answers.framework == 'zeop' ){
download('http://apps.bdimg.com/libs/zepto/1.1.4/zepto.min.js', path.join(cmd,'j')).then(() => {
log(chalk.green('zepto文件创建~'));
});
jsStr = '<script src="j/zepto.min.js"></script>';
} }); fse.ensureDir( join(cmd,'i') ); if( answers.sass ){
fse.ensureDir( join(cmd,'s') ).then(() => {
Gitdownload('uustoboy/base_mixins',join(cmd,'/s/base_mixins'),function(){
var txt = `@charset "UTF-8";\n@import "./base_mixins/_base_mixins.scss";`;
fse.outputFileSync( join( process.cwd(),cmd,'/s/index.scss'), txt);
log(chalk.green('sass文件创建~'));
});
});
} let as = join(__dirname,'..','lib/templates/',option._name,'index.html');
let bs = join(process.cwd(),cmd,'index.html'); fse.readFile(as,'utf8').then(data=>{ var data = data; if(answers.base){
var c = data.replace(/<%getCSS%>/g,'<link rel="stylesheet" href="c/base.css">');
}else{
var c = data.replace(/<%getCSS%>/g,'');
} if( answers.framework ){
var j = c.replace(/<%getJS%>/g,jsStr);
}else{
var j = c.replace(/<%getJS%>/g,jsStr);
} fs.writeFile(bs,j,function(){
log(chalk.green('默认html文件创建~'));
}) }); });
} function createFile(cmd,option){
var promps = []; promps.push({
type: 'confirm',
name: 'base',
message: '创建base.css文件'
}); promps.push({
type: 'list',
name: 'framework',
message: '使用框架库',
choices:[
{
name: '不使用框架库',
value: false
},
{
name: 'jquery.js',
value: 'jquery'
},
{
name: 'zeop.js',
value: 'zeop'
}
]
}); promps.push({
type: 'confirm',
name: 'sass',
message: '是否使用sass'
}); inquirer.prompt(promps).then(function (answers) {
//log(answers)
createInfo(answers,cmd,option);
}); }

第二步 package.json 配置

"bin": { "cf": "bin/cf.js" },

第三步 添加到全局(如果报错很有可能是你的命令名系统本来有了需要你删除在按)

$ sudo npm install . -g

发布模块:

先注册npm账号:(填 用户名、用户密码、邮件)

$ npm adduser

如果注册登录:

$ npm login

发布模块:(第一次发布的时候最好在npm搜搜你package.json里‘name’有木有已经发的要不然发布不了,每一次要发布npm上必须要更改‘version’的版本号)

$ npm publish 

(注意:如果npm源更改成淘宝镜像的要改回npm源,淘宝镜像源发布会报错发布不了,推荐使用 nrm 包查看、切换)

删除模板:

$ npm unpublish --force [name]

全局安装模块:

$ npm install [name] -g

参考资料:

极客学院《使用 Node.js 开发命令行工具》 (视频教学)

阮一峰   :《Node.js 命令行程序开发教程》

小弟调调 :《Nodejs 制作命令行工具》

自成   :《跟着老司机玩转Node命令行》

node命令行工具—cf-cli的更多相关文章

  1. 十分钟用 Node 命令行工具打造 react-cli 脚手架

    如果你有以下想法: 每次新开项目需要copy一堆文件/文件夹,太烦!想要快速建立工程 用了vue-cli.react-app,羡慕!想要自己做一个 你只需花十分钟时间,做一个Node命令行工具,打造属 ...

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

    一.目的 传统的前端项目初始流程一般是这样: 可以看出,传统的初始化步骤,花费的时间并不少.而且,人工操作的情况下,总有改漏的情况出现.这个缺点有时很致命. 甚至有马大哈,没有更新项目仓库地址,导致提 ...

  3. 【Nodejs】326- 从零开发一个node命令行工具

    本文由 IMWeb 社区授权转载自腾讯内部 KM 论坛.点击阅读原文查看 IMWeb 社区更多精彩文章. 什么是命令行工具? 命令行工具(Cmmand Line Interface)简称cli,顾名思 ...

  4. 『.NET Core CLI工具文档』(一).NET Core 命令行工具(CLI)

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Command Line Tools 翻译:.NET Core命令行工具 什么是 .NET Core ...

  5. 快速写个node命令行工具

    1.package.json-bin配置 [创建bat文件,把bat路径添加到PATH中]这些固定的工作可以由npm帮我们完成.package.json中有个bin字段配置: bin: { " ...

  6. Apache Kafka系列(二) 命令行工具(CLI)

    Apache Kafka命令行工具(Command Line Interface,CLI),下文简称CLI. 1. 启动Kafka 启动Kafka需要两步: 1.1. 启动ZooKeeper [roo ...

  7. 手动封装一个node命令集工具

    了解NPM安装模块时与项目配置文件中的bin配置发生了什么 了解nodejs在控制台中的运行环境及上下文 基于自定义命令集工具集成Yeoman 一.NPM模块安装内幕与nodejs控制台运行环境 1. ...

  8. node命令行开发

    node命令行开发比较出名的就是commander和yargs,以及inquirer,但是很少有文章将三个模块进行对比. 这里简单的描述一下: 1. commander直观,易上手,但是功能较弱,没有 ...

  9. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

随机推荐

  1. MarkDownPad2基本语法

    一.换行和空格   (1)换行   行尾加两个空格   (2)空格     二.标题   在#后跟个空格再写文字,一个#是一级标题,两个#是二级标题,以此类推,支持六级标题.   示例: # 一级标题 ...

  2. JS对JSON对象遍历输出的时候真的是按照顺序输出吗?

    对象的遍历输出并不是按照对象属性定义顺序来的,那么是按照什么规则来的呢,仔细深入研究你会发现,这还跟浏览器有关系,Chrome跟IE是不一样的,所以给出以下结论: Chrome Opera 的 Jav ...

  3. python + django + echart 构建中型项目

    1. python生产环境, 多层modules 导入问题: 多个modules 如何导入不同级别的包: 在每个modules下新建 __init__.pyimport os, sys dir_myt ...

  4. 利用Python查看微信共同好友

    思路 首先通过itchat这个微信个人号接口扫码登录个人微信网页版,获取可以识别好友身份的数据.这里是需要分别登录两人微信的,拿到两人各自的好友信息存到列表中. 这样一来,查共同好友就转化成了查两个列 ...

  5. jsonp原理,封装,应用(vue项目)

    jsonp原理 JSON是一种轻量级的数据传输格式. JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 ...

  6. springdata 动态查询之排序

  7. 台达PLC实现远程下载程序

    台达PLC实现远程下载程序 日期:2019-04-27                    时间    08:33:57 让物联变得更简单 18-09-2411:25 明明在公司调试没问题的设备一到 ...

  8. 接入HTTPS协议的CAS登录配置

    1.在CAS服务器创建tomcat.keystore(记住keystone创建时输入的密码) keytool -genkeypair -alias "tomcat" -keyalg ...

  9. python format() 函数

    转载 https://www.cnblogs.com/wushuaishuai/p/7687728.html 正文 Python2.6 开始,新增了一种格式化字符串的函数 format() ,它增强了 ...

  10. 拆系数FFT

    学习内容:国家集训队2016论文 - 再谈快速傅里叶变换 模板题:http://uoj.ac/problem/34 1.基本介绍 对长度为L的\(A(x),B(x)\)进行DFT,可以利用 \[ \b ...