commander.jsで自分の足場道具を構築する
7687 ワード
先端技術の発展につれて、工程化はだんだん一つの傾向になってきました.しかし、実際の開発では、プロジェクトを構築するのは非常に複雑なことです.特にフレームワークの使い方がよくわからない時に.そこで、多くのフレームは足場道具を持参しています.先端項目を初期化する時、自分で最初から組み立てる必要がなく、コマンドラインに初期化命令を入力すればいいです.
では、自分でこのようなコマンドラインツールを開発してカスタマイズ項目を初期化したいなら、どうすればいいですか?研究しているうちに、偶然見つけました.
一、commander.jsの基本的な使い方
1.据え付け
binディレクトリを新規作成し、そのディレクトリの下にtest.jsファイルを新規作成します.ファイルの内容:
・version
作用:コマンドプログラムのバージョン番号を定義する用法例:version('0.0.1'、'-v、--version')パラメータ解析:①バージョン番号
②カスタムフラグ:デフォルトは
作用:コマンドオプションの使用例を定義するために使用します.option('-n、--name'、'name description'、'default name')パラメータ解析:①カスタムフラグ:長さの識別に分けられています.中間はコンマ、縦またはスペースで区切られます.フラグの後に必要な引数または任意のパラメータがあります.前者は
③標準値
・command
作用:コマンド名の使用例を追加します.commmand('rmdir[otherDirs...],'install description',opts)パラメータ解析:①コマンド名:コマンド後のフォローアップが可能です.
③配置オプション:noHelp、isDefaultなどの設定が可能です.
・description
作用:コマンドの説明を定義する
使用例:.description('rmdir desc')
・action
作用:コマンドのコールバック関数を定義します.
使い方例:.action(fn)
・パーrse
作用:process.argvを解析するために、オプティクスを設定し、commandをトリガする用法例:.parse(process.argv)
二、commander.jsを使ってローカルモジュールinit-commander-toolを開発する.
1.新規ディレクトリは以下の通りです.
`
「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」 }
`
・〹!/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のコードは以下の通りです.
このdemoはプロジェクトコピーを初期化するために使われていますので、自分の必要に応じて構築できます.足場ツールを使ってプロジェクトを初期化してもいいし、自分で一歩ずつ構築してもいいです.
構築されたプロジェクトをtemplatesディレクトリにコピーして(nodemo-commander-toolディレクトリで実行してもいいです.コピーしなくてもいいです.)
四、全体使用
package.jsonにbinフィールドを追加します.
では、自分でこのようなコマンドラインツールを開発してカスタマイズ項目を初期化したいなら、どうすればいいですか?研究しているうちに、偶然見つけました.
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
はい、プロジェクト名は自分で定義できます.