commander.jsで自分の足場道具を構築する

7687 ワード

先端技術の発展につれて、工程化はだんだん一つの傾向になってきました.しかし、実際の開発では、プロジェクトを構築するのは非常に複雑なことです.特にフレームワークの使い方がよくわからない時に.そこで、多くのフレームは足場道具を持参しています.先端項目を初期化する時、自分で最初から組み立てる必要がなく、コマンドラインに初期化命令を入力すればいいです.
では、自分でこのようなコマンドラインツールを開発してカスタマイズ項目を初期化したいなら、どうすればいいですか?研究しているうちに、偶然見つけました.  commander.js このモジュールは、コマンドラインツールの開発を助けることができます.そこで研究しながらこのノートを整理しました.
一、commander.jsの基本的な使い方
1.据え付け
mkdir commander-example && cd commander-example
npm install commander --save
2.使用
binディレクトリを新規作成し、そのディレクトリの下にtest.jsファイルを新規作成します.ファイルの内容:
//     
var program = require('commander');

//          
program
  .version('0.1.0', '-v, --version')
  .option('-i, --init', 'init something')
  .option('-g, --generate', 'generate something')
  .option('-r, --remove', 'remove something');

//    .parse()  ,  node emit()    
program.on('--help', function(){
 console.log('  Examples:');
  console.log('');
  console.log('    this is an example');
  console.log('');
});

program.parse(process.argv);

if(program.init) {
  console.log('init something')
}

if(program.generate) {
  console.log('generate something')
}

if(program.remove) {
  console.log('remove something')
}
コマンドラインにテストを入力します.
node bin\test --help
次のような結果が得られました.
Usage: test [options]

  Options:

    -v, --version   output the version number
    -i, --init      init something
    -g, --generate  generate something
    -r, --remove    remove something
    -h, --help      output usage information
  Examples:

    this is an example
3.API解析
・version
作用:コマンドプログラムのバージョン番号を定義する用法例:version('0.0.1'、'-v、--version')パラメータ解析:①バージョン番号
②カスタムフラグ:デフォルトは  -V 和  --version・option
作用:コマンドオプションの使用例を定義するために使用します.option('-n、--name'、'name description'、'default name')パラメータ解析:①カスタムフラグ:長さの識別に分けられています.中間はコンマ、縦またはスペースで区切られます.フラグの後に必要な引数または任意のパラメータがあります.前者は  <> ふくめる  [] 含む②オプションの説明:使用中  --help コマンド時にフラグの説明を表示します.
③標準値
・command
作用:コマンド名の使用例を追加します.commmand('rmdir[otherDirs...],'install description',opts)パラメータ解析:①コマンド名:コマンド後のフォローアップが可能です.  <> または  [] 含まれるパラメータコマンドの最後のパラメータは可変であり、例のように配列の後ろに追加されます.  ... フラグコマンドの後に入るパラメータは、  action のコールバック関数と  program.args 配列中②コマンド記述:存在し、かつ呼び出しaction(fn)が表示されないと、サブコマンドプログラムが起動します.そうでないとエラーが発生します.
③配置オプション:noHelp、isDefaultなどの設定が可能です.
・description
作用:コマンドの説明を定義する
使用例:.description('rmdir desc')
・action
作用:コマンドのコールバック関数を定義します.
使い方例:.action(fn)
・パーrse
作用:process.argvを解析するために、オプティクスを設定し、commandをトリガする用法例:.parse(process.argv)
二、commander.jsを使ってローカルモジュールinit-commander-toolを開発する.
1.新規ディレクトリは以下の通りです.

init-commander-tool
  |-bin 
    |-init-project.js
  |-lib 
    |-install.js
  |-templates
2.運転  npm init を選択して項目を初期化し、項目名はinit-commander-toolに設定し、依存パッケージをインストールします.
`
「devDependencies」:{    「chalk」:「^2.4.1」、    「commander」:「^2.5.1」、    「fs-extra」:「^6.0.1」、    「path」:「^0.2.7」、    「through 2」:「^2.0.3」    「vinyl-fs」:「^3.0.3」、    「which」:「^1.3.1」  }
`
 
npm init
npm install
3.init-port.jsのコードは以下の通りです.
//          
#! /usr/bin/env node

//     
var program = require('commander');
var vfs = require('vinyl-fs');
var through = require('through2');
const chalk = require('chalk');
const fs = require('fs-extra');
const path = require('path');

//            
program
  .version('1.0.0')
  .option('-i --init [name]', 'init a project', 'myFirstProject')
    
program.parse(process.argv);

if(program.init) {
  //             
  var projectPath = path.resolve(program.init);
  //             
  var projectName = path.basename(projectPath);
    
  console.log(`Start to init a project in ${chalk.green(projectPath)}`);

  //                 
  fs.ensureDirSync(projectName);

  //         demo1  
  var cwd = path.join(__dirname, '../templates/demo1');
  
  //  demo1      node_modules             
  vfs.src(['**/*', '!node_modules/**/*'], {cwd: cwd, dot: true})
  pipe(through.obj(function(file, enc, callback){
    if(!file.stat.isFile()) {
      return callback();
  }
        
  this.push(file);
    return callback();
  }))
   //   demo1                     
  .pipe(vfs.dest(projectPath))
  .on('end', function() {
    console.log('Installing packages...')
    
    //  node                
    process.chdir(projectPath);

    //       
    require('../lib/install');
  })
  .resume();
}
 
・〹!/usr/bin/env node
スクリプトの実行プログラムを指定します.ここはnodeです.使ってもいいです./usr/bin/nodeですが、ユーザーがnodeを非デフォルトのパスにインストールすると、nodeが見つかりません.だから、env(環境変数を含む)でnodeインストールディレクトリを検索する方がいいです.
 
・vinyl-fs:
Vinylはファイルのメタデータオブジェクトを記述するために使用され、このモジュールは主に2つの方法srcとdestを暴露し、それらはそれぞれデータストリームに戻ります.違いは前者はVinylオブジェクトを提供し、後者はVinylオブジェクトを使用します.簡単にはファイルを読み取り、もう一方はディスクにファイルを書き込みます.
param@src:src(globs[,options])
最初のパラメータは文字列または文字列配列で、ファイルの位置を示します.配列であれば、前から後までの順序で実行されますが、付いています!(非)記号のパスは後ろに置いてください.2番目のパラメータはオプションオブジェクトです.具体的な構成を参照してください.
param@dest:dest(folder[,options])
最初のパラメータはフォルダパスまたは関数です.後者の場合は、各Vinylファイルオブジェクトを処理するために使用されます.関数はフォルダパスを返さなければなりません.2番目のパラメータはオプションオブジェクトです.具体的な構成を参照してください.この方法はファイルオブジェクトストリームに戻り、ディスクに書き込み、パイプの下流に転送するため、パイプ内で動作し続けます.を選択します.ファイルにsymlink属性があると、シンボリックリンクが作成されます.
 
・through 2:
through 2は主にnodeのstreams.Transformのシンプルなパッケージを使用しています.具体的な使い方はthrough 2*.
4.install.jsのコードは以下の通りです.
//     
var which = require('which');
const chalk = require('chalk');

var childProcess = require('child_process');

//         npm install  
function runCmd(cmd, args, fn) {
  args = args || [];
  var runner = childProcess.spawn(cmd, args, {
    stdio: 'inherit'    
  });
    
  runner.on('close', function(code) {
    if(fn) {
      fn(code);
    }
  })
}

//                
function findNpm() {
  var npms = ['tnpm', 'cnpm', 'npm'];
  for(var i = 0; i < npms.length; i++) {
    try {
      //                      
      which.sync(npms[i]);
      console.log('use npm: ' + npms[i]);
      return npms[i]
    }catch(e) {     
    }
  }
  throw new Error(chalk.red('please install npm'));
}

var npm = findNpm();
runCmd(which.sync(npm), ['install'], function() {
  console.log(npm + ' install end');
})
三、構築項目デモ
このdemoはプロジェクトコピーを初期化するために使われていますので、自分の必要に応じて構築できます.足場ツールを使ってプロジェクトを初期化してもいいし、自分で一歩ずつ構築してもいいです.
構築されたプロジェクトをtemplatesディレクトリにコピーして(nodemo-commander-toolディレクトリで実行してもいいです.コピーしなくてもいいです.)  node bin\init-project --help すべてのコマンドが正常に表示されるかどうかをテストします.
四、全体使用
package.jsonにbinフィールドを追加します.
// bin                      
"bin": {
    "initP": "./bin/init-project"
  },
そしてinit-commander-toolディレクトリで実行します.  npm linkは、ローカルモジュールをグローバル環境にリンクすることにより、どこでもinitPコマンドを使用することができます.コマンドラインには、initP --helpと入力します.以下の内容があれば、通常に使用することができます.
Usage: init-project [options]

  Options:

    -V, --version     output the version number
    -i --init [name]  init a project (default: myFirstProject)
    -h, --help        output usage information
最後にイニシャル項目が必要なところで動作します.  initP --init myProject はい、プロジェクト名は自分で定義できます.