ÏñÎÒÃÇÊìϤµÄ vue-cli£¬react-native-cli µÈ½ÅÊּܣ¬Ö»ÐèÒªÊäÈë¼òµ¥µÄÃüÁî vue init webpack project£¬¼´¿É¿ìËÙ°ïÎÒÃÇÉú³ÉÒ»¸ö³õʼÏîÄ¿¡£ÔÚʵ¼Ê¹¤×÷ÖУ¬ÎÒÃÇ¿ÉÒÔ¶¨ÖÆÒ»¸öÊôÓÚ×Ô¼ºµÄ½ÅÊּܣ¬À´Ìá¸ß×Ô¼ºµÄ¹¤×÷ЧÂÊ¡£
ΪʲôÐèÒªÐèÒª½ÅÊּܣ¿
¼õÉÙÖØ¸´ÐԵŤ×÷£¬²»ÔÙÐèÒª¸´ÖÆÆäËûÏîÄ¿ÔÙɾ³ýÎ޹شúÂ룬»òÕß´ÓÁã´´½¨Ò»¸öÏîÄ¿ºÍÎļþ¡£
¸ù¾Ý½»»¥¶¯Ì¬Éú³ÉÏîÄ¿½á¹¹ºÍÅäÖÃÎļþµÈ¡£
¶àÈËÐ×÷¸üΪ·½±ã£¬²»ÐèÒª°ÑÎļþ´«À´´«È¥¡£
˼·
Òª¿ª·¢½ÅÊּܣ¬Ê×ÏÈÒªÀíÇå˼·£¬½ÅÊÖ¼ÜÊÇÈçºÎ¹¤×÷µÄ£¿ÎÒÃÇ¿ÉÒÔ½è¼ø vue-cli µÄ»ù±¾Ë¼Â·¡£vue-cli Êǽ«ÏîĿģ°å·ÅÔÚ git ÉÏ£¬ÔËÐеÄʱºòÔÙ¸ù¾ÝÓû§½»»¥ÏÂÔØ²»Í¬µÄÄ£°å£¬¾¹ýÄ£°åÒýÇæäÖȾ³öÀ´£¬Éú³ÉÏîÄ¿¡£ÕâÑù½«Ä£°åºÍ½ÅÊּܷÖÀ룬¾Í¿ÉÒÔ¸÷×Ôά»¤£¬¼´Ê¹Ä£°åÓб䶯£¬Ö»ÐèÒªÉÏ´«×îеÄÄ£°å¼´¿É£¬¶ø²»ÐèÒªÓû§È¥¸üнÅÊּܾͿÉÒÔÉú³É×îеÄÏîÄ¿¡£ÄÇô¾Í¿ÉÒÔ°´ÕÕÕâ¸ö˼·À´½øÐпª·¢ÁË¡£
µÚÈý·½¿â
Ê×ÏÈÀ´¿´¿´»áÓõ½ÄÄЩ¿â¡£
commander.js£¬¿ÉÒÔ×Ô¶¯µÄ½âÎöÃüÁîºÍ²ÎÊý£¬ÓÃÓÚ´¦ÀíÓû§ÊäÈëµÄÃüÁî¡£
download-git-repo£¬ÏÂÔØ²¢ÌáÈ¡ git ²Ö¿â£¬ÓÃÓÚÏÂÔØÏîĿģ°å¡£
Inquirer.js£¬Í¨ÓõÄÃüÁîÐÐÓû§½çÃæ¼¯ºÏ£¬ÓÃÓÚºÍÓû§½øÐн»»¥¡£
handlebars.js£¬Ä£°åÒýÇæ£¬½«Óû§Ìá½»µÄÐÅÏ¢¶¯Ì¬Ìî³äµ½ÎļþÖС£
ora£¬ÏÂÔØ¹ý³Ì¾ÃµÄ»°£¬¿ÉÒÔÓÃÓÚÏÔʾÏÂÔØÖе͝»Ð§¹û¡£
chalk£¬¿ÉÒÔ¸øÖն˵Ä×ÖÌå¼ÓÉÏÑÕÉ«¡£
log-symbols£¬¿ÉÒÔÔÚÖÕ¶ËÉÏÏÔʾ³ö √ »ò × µÈµÄͼ±ê¡£
³õʼ»¯ÏîÄ¿
Ê×ÏÈ´´½¨Ò»¸ö¿ÕÏîÄ¿£¬ÔÝʱÃüÃûΪ okii-cli£¬È»ºóн¨Ò»¸ö index.js Îļþ£¬ÔÙÖ´ÐÐ npm init Éú³ÉÒ»¸ö package.json Îļþ¡£×îºó°²×°ÉÏÃæÐèÒªÓõ½µÄÒÀÀµ¡£
npm install commander download-git-repo inquirer handlebars ora chalk log-symbols -S
´¦ÀíÃüÁîÐÐ
node.js ÄÚÖÃÁ˶ÔÃüÁîÐвÙ×÷µÄÖ§³Ö£¬ÔÚ package.json ÖÐµÄ bin ×ֶοÉÒÔ¶¨ÒåÃüÁîÃûºÍ¹ØÁªµÄÖ´ÐÐÎļþ¡£ËùÒÔÏÖÔÚ package.json ÖмÓÉÏ bin µÄÄÚÈÝ£º
{
"name": "okii-cli",
"version": "1.0.0",
"description": "»ùÓÚnodeµÄ½ÅÊּܹ¤¾ß",
"bin": {
"okii": "index.js"
},
...
}
È»ºóÔÚ index.js ÖÐÀ´¶¨Òå init ÃüÁ
#!/usr/bin/env node
const program = require('commander');
program.version('1.0.0', '-v, --version')
.command('init <name>')
.action((name) => {
console.log(name);
});
program.parse(process.argv);
µ÷Óà version('1.0.0', '-v, --version') »á½« -v ºÍ –version Ìí¼Óµ½ÃüÁîÖУ¬¿ÉÒÔͨ¹ýÕâЩѡÏî´òÓ¡³ö°æ±¾ºÅ¡£
µ÷Óà command('init <name>') ¶¨Òå init ÃüÁname ÔòÊDZش«µÄ²ÎÊý£¬ÎªÏîÄ¿Ãû¡£
action() ÔòÊÇÖ´ÐÐ init ÃüÁî»á·¢ÉúµÄÐÐΪ£¬ÒªÉú³ÉÏîÄ¿µÄ¹ý³Ì¾ÍÊÇÔÚÕâÀïÃæÖ´Ðеģ¬ÕâÀïÔÝʱֻ´òÓ¡³ö name¡£
Æäʵµ½ÕâÀÒѾ¿ÉÒÔÖ´ÐÐ init ÃüÁîÁË¡£ÎÒÃÇÀ´²âÊÔһϣ¬ÔÚ okii-cli µÄͬ¼¶Ä¿Â¼ÏÂÖ´ÐУº
node ./okii-cli/index.js init HelloWorld
¿ÉÒÔ¿´µ½ÃüÁîÐй¤¾ßÒ²´òÓ¡³öÁË HelloWorld£¬ÄÇôºÜÇå³þ£¬ action((name) => {}) ÕâÀïµÄ²ÎÊý name£¬¾ÍÊÇÎÒÃÇÖ´ÐÐ init ÃüÁîʱÊäÈëµÄÏîÄ¿Ãû³Æ¡£
ÃüÁîÒѾÍê³É£¬½ÓÏÂÀ´¾ÍÒªÏÂÔØÄ£°åÉú³ÉÏîÄ¿½á¹¹ÁË¡£
ÏÂÔØÄ£°å
download-git-repo Ö§³Ö´Ó Github¡¢Gitlab ºÍ Bitbucket ÏÂÔØ²Ö¿â£¬¸÷×ԵľßÌåÓ÷¨¿ÉÒԲο¼¹Ù·½Îĵµ¡£
ÓÉÓÚÊǹ«Ë¾ÏîÄ¿£¬ËùÒÔ°ÑÄ£°å²Ö¿â·ÅÔÚÁË Gitlab ÉÏ£¬ÄÇôÔÚ action() ÖнøÐвÙ×÷ÏÂÔØÄ£°å£º
#!/usr/bin/env node
const program = require('commander');
const download = require('download-git-repo');
program.version('1.0.0', '-v, --version')
.command('init <name>')
.action((name) => {
download('http://xxxxxx:9999:HTML5/H5Template#master', name, {clone: true}, (err) => {
console.log(err ? 'Error' : 'Success')
})
});
program.parse(process.argv);
download() µÚÒ»¸ö²ÎÊý¾ÍÊÇ²Ö¿âµØÖ·£¬µ«ÊÇÓÐÒ»µãµã²»Ò»Ñù¡£Êµ¼ÊµÄ²Ö¿âµØÖ·ÊÇ http://xxxxxx:9999/HTML5/H5Template#master £¬¿ÉÒÔ¿´µ½¶Ë¿ÚºÅºóÃæµÄ ‘/‘ ÔÚ²ÎÊýÖÐҪд³É ‘:’£¬#master ´ú±íµÄ¾ÍÊÇ·ÖÖ§Ãû£¬²»Í¬µÄÄ£°å¿ÉÒÔ·ÅÔÚ²»Í¬µÄ·ÖÖ§ÖУ¬¸ü¸Ä·ÖÖ§±ã¿ÉÒÔʵÏÖÏÂÔØ²»Í¬µÄÄ£°åÎļþÁË¡£µÚ¶þ¸ö²ÎÊýÊÇ·¾¶£¬ÉÏÃæÎÒÃÇÖ±½ÓÔÚµ±Ç°Â·¾¶Ï´´½¨Ò»¸ö name µÄÎļþ¼Ð´æ·ÅÄ£°å£¬Ò²¿ÉÒÔʹÓöþ¼¶Ä¿Â¼±ÈÈç test/${name}
ÃüÁîÐн»»¥
ÃüÁîÐн»»¥¹¦ÄÜ¿ÉÒÔÔÚÓû§Ö´ÐÐ init ÃüÁîºó£¬ÏòÓû§Ìá³öÎÊÌ⣬½ÓÊÕÓû§µÄÊäÈë²¢×÷³öÏàÓ¦µÄ´¦Àí¡£ÕâÀïʹÓà inquirer.js À´ÊµÏÖ¡£
const inquirer = require('inquirer');
inquirer.prompt([
{
type: 'input',
name: 'author',
message: 'ÇëÊäÈë×÷ÕßÃû³Æ'
}
]).then((answers) => {
console.log(answers.author);
})
ͨ¹ýÕâÀïÀý×Ó¿ÉÒÔ¿´³ö£¬ÎÊÌâ¾Í·ÅÔÚ prompt() ÖУ¬ÎÊÌâµÄÀàÐÍΪ input ¾ÍÊÇÊäÈëÀàÐÍ£¬name ¾ÍÊÇ×÷Ϊ´ð°¸¶ÔÏóÖÐµÄ key£¬message ¾ÍÊÇÎÊÌâÁË£¬Óû§ÊäÈëµÄ´ð°¸¾ÍÔÚ answers ÖУ¬Ê¹ÓÃÆðÀ´¾ÍÊÇÕâô¼òµ¥¡£¸ü¶àµÄ²ÎÊýÉèÖÿÉÒԲο¼¹Ù·½Îĵµ¡£
ͨ¹ýÃüÁîÐн»»¥£¬»ñµÃÓû§µÄÊäÈ룬´Ó¶ø¿ÉÒÔ°Ñ´ð°¸äÖȾµ½Ä£°åÖС£
äÖȾģ°å
ÕâÀïÓà handlebars µÄÓï·¨¶Ô HTML5/H5Template ²Ö¿âµÄÄ£°åÖÐµÄ package.json Îļþ×öһЩÐÞ¸Ä
{
"name": "{{name}}",
"version": "1.0.0",
"description": "{{description}}",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "{{author}}",
"license": "ISC"
}
²¢ÔÚÏÂÔØÄ£°åÍê³ÉÖ®ºó½«Óû§ÊäÈëµÄ´ð°¸äÖȾµ½ package.json ÖÐ
program.version('1.0.0', '-v, --version')
.command('init <name>')
.action((name) => {
inquirer.prompt([
{
name: 'description',
message: 'ÇëÊäÈëÏîÄ¿ÃèÊö'
},
{
name: 'author',
message: 'ÇëÊäÈë×÷ÕßÃû³Æ'
}
]).then((answers) => {
download('xxxxx#master',name,{clone: true},(err) => {
const meta = {
name,
description: answers.description,
author: answers.author
}
const fileName = `${name}/package.json`;
const content = fs.readFileSync(fileName).toString();
const result = handlebars.compile(content)(meta);
fs.writeFileSync(fileName, result);
})
})
});
ÕâÀïʹÓÃÁË node.js µÄÎļþÄ£¿é fs£¬½« handlebars äÖȾÍêºóµÄÄ£°åÖØÐÂдÈëµ½ÎļþÖС£
ÊÓ¾õÃÀ»¯
ÔÚÓû§ÊäÈë´ð°¸Ö®ºó£¬¿ªÊ¼ÏÂÔØÄ£°å£¬ÕâʱºòʹÓà ora À´ÌáʾÓû§ÕýÔÚÏÂÔØÖС£
const ora = require('ora');
// ¿ªÊ¼ÏÂÔØ
const spinner = ora('ÕýÔÚÏÂÔØÄ£°å...');
spinner.start();
// ÏÂÔØÊ§°Üµ÷ÓÃ
spinner.fail();
// ÏÂÔØ³É¹¦µ÷ÓÃ
spinner.succeed();
È»ºóͨ¹ý chalk À´Îª´òÓ¡ÐÅÏ¢¼ÓÉÏÑùʽ£¬±ÈÈç³É¹¦ÐÅϢΪÂÌÉ«£¬Ê§°ÜÐÅϢΪºìÉ«£¬ÕâÑù×Ó»áÈÃÓû§¸ü¼ÓÈÝÒ׷ֱ棬ͬʱҲÈÃÖն˵ÄÏÔʾ¸ü¼ÓµÄºÃ¿´¡£
const chalk = require('chalk');
console.log(chalk.green('ÏîÄ¿´´½¨³É¹¦'));
console.log(chalk.red('ÏîÄ¿´´½¨Ê§°Ü'));
³ýÁ˸ø´òÓ¡ÐÅÏ¢¼ÓÉÏÑÕɫ֮Í⣬»¹¿ÉÒÔʹÓà log-symbols ÔÚÐÅÏ¢Ç°Ãæ¼ÓÉÏ √ »ò × µÈµÄͼ±ê
const chalk = require('chalk');
const symbols = require('log-symbols');
console.log(symbols.success, chalk.green('ÏîÄ¿´´½¨³É¹¦'));
console.log(symbols.error, chalk.red('ÏîÄ¿´´½¨Ê§°Ü'));
ÍêÕûʾÀý
#!/usr/bin/env node
const fs = require('fs');
const program = require('commander');
const download = require('download-git-repo');
const handlebars = require('handlebars');
const inquirer = require('inquirer');
const ora = require('ora');
const chalk = require('chalk');
const symbols = require('log-symbols');
program.version('1.0.0', '-v, --version')
.command('init <name>')
.action((name) => {
if(!fs.existsSync(name)){
inquirer.prompt([
{
name: 'description',
message: 'ÇëÊäÈëÏîÄ¿ÃèÊö'
},
{
name: 'author',
message: 'ÇëÊäÈë×÷ÕßÃû³Æ'
}
]).then((answers) => {
const spinner = ora('ÕýÔÚÏÂÔØÄ£°å...');
spinner.start();
download('http://xxxxxx:9999:HTML5/H5Template#master', name, {clone: true}, (err) => {
if(err){
spinner.fail();
console.log(symbols.error, chalk.red(err));
}else{
spinner.succeed();
const fileName = `${name}/package.json`;
const meta = {
name,
description: answers.description,
author: answers.author
}
if(fs.existsSync(fileName)){
const content = fs.readFileSync(fileName).toString();
const result = handlebars.compile(content)(meta);
fs.writeFileSync(fileName, result);
}
console.log(symbols.success, chalk.green('ÏîÄ¿³õʼ»¯Íê³É'));
}
})
})
}else{
// ´íÎóÌáʾÏîÄ¿ÒÑ´æÔÚ£¬±ÜÃ⸲¸ÇÔÓÐÏîÄ¿
console.log(symbols.error, chalk.red('ÏîÄ¿ÒÑ´æÔÚ'));
}
})
program.parse(process.argv);
Ч¹ûÈçÏ£º
Íê³ÉÖ®ºó£¬¾Í¿ÉÒ԰ѽÅÊּܷ¢²¼µ½ npm ÉÏÃæ£¬Í¨¹ý -g ½øÐÐÈ«¾Ö°²×°£¬¾Í¿ÉÒÔÔÚ×Ô¼º±¾»úÉÏÖ´ÐÐ okii init [name] À´³õʼ»¯ÏîÄ¿£¬ÕâÑù±ãÍê³ÉÁËÒ»¸ö¼òµ¥µÄ½ÅÊּܹ¤¾ßÁË¡£
×÷ÕߣºÀÖÓã²¥¿Íǰ¶ËÓëÒÆ¶¯¿ª·¢ÅàѵѧԺ
Ê×·¢£º http://web.itcast.cn