ノードを指定してCLIをビルドします.js
我々は、それがgit、grep、awk、NPM、または他の端末アプリであるかどうか、コマンドラインユーティリティを使用します.クリスは、通常、何かを成し遂げる最速の方法です.あなたの特定のワークフローの何かを何度も繰り返して行う必要がありますか?チャンスは、CLIで自動化することができます.
私たちは使用するつもりですNode.js それがタイトル自体から明らかでないならば、我々のCLIを作るために.なぜ?ノードですから.JS生態系は我々が何をしようとしているかを達成するために利用できる非常に便利なパッケージの何千も持っています.それが何をしようとしているとしても、それにはパッケージが存在する可能性が高いnpm , また、ノードは組み込みのライブラリを持っていて、ファイルを処理したり、他のアプリケーションを起動したり、テストをアサートしたりすることがたくさんあります.JSは非常に移植性があります.そして、彼らが異なるOSSにインストールするのが簡単であるということを意味します.
このチュートリアルの目的のために、言語間で翻訳する簡単なCLIを構築します.文字列型引数を受け取り、それらを文に解析し、翻訳APIを翻訳し、結果を表示します.このための完全なコードはGithub repository . 右に飛び込みましょう!
必要条件
CLIを作成するために必要なツールは以下のようになります.
プロジェクトの設定
基本的なノードを設定します.JSプロジェクト
~$mkdir termTranslate
3 .それに移動します.~$cd termTranslate
4 .ノードの初期化.そのフォルダのJSプロジェクト.~$npm init
5 .プロンプトを入力します.あなたのプロジェクトが設定されます.
基本的なCLIのビルド
ノードプロジェクトの準備ができたので、実際にCLIを作成します.しなければならないことがあります.
bin
プロジェクトのルートディレクトリにあります.bin
ファイルを作成するindex.js
これは私たちのCLIのエントリポイントになります.package.json
ファイルを変更しますbin/index.js
. package.json
ファイル名bin
そしてそれをキーに設定しますtran
それでsの値
./bin/index.js
. 追加は次のようになります."bin": {
"tran": "./bin/index.js"
}
キー.tran
, CLIを呼び出すためのキーワードです.これは、人々がCLIを使用するために端末でタイプするキーワードです.名前を短く保つことをお勧めしますがそして、それはタイプを迅速かつ覚えやすいようにセマンティック.
ここで定義されている名前は永久ではなく、いつでも好きなときに変更することができます.
全体
package.json
ファイルは次のようになります.{
"name": "termtran",
"version": "1.0.0",
"description": "A CLI to translate between languages in the terminal",
"main": "bin/index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [
"cli"
],
"bin": {
"tran": "./bin/index.js"
},
"author": "Your Name",
"license": "ISC"
}
Note: Don’t forget to add the extra comma after adding the new entry into the
package.json
file. That is an easy mistake.
5 .オープン
index.js
ファイル名bin
フォルダ.次のコードを入れます.#! /usr/bin/env node
console.log("Hello World!");
The first line starting with
#!
is called ashebang
line or abang
line. A shebang line is used to specify the absolute path to the interpreter that will run the below code. The shebang line used here is for Linux or UNIX type systems but node requires it for Windows and macOS too, for proper installation and execution of the script.
さて、CLIをインストールしてテストしましょう.
人々はシステムのどこからでもCLIを呼び出すことができますので、グローバルにインストールしましょう.
プロジェクトのルートディレクトリに移動し
~$npm install -g .
The -g
フラグはシステムにグローバルにパッケージをインストールするようにNPMに伝えます.端末で指定されたキーワードを入力してCLIをテストします.
~$tran
すべてが正しく行われるならば、あなたは我々がコンソールに送るメッセージで迎えられなければなりません.ログインするin
dex.js
ファイル.このような
すべて良い!
コマンドライン引数の取り扱い
我々の基本的なCLIは準備ができています、そして、現在我々は更なる機能性を加えるために動きます.
どんなCLIがする最も基本的な仕事はコマンドライン引数を扱います.我々のCLIでは、我々は引数として翻訳される言語名と文を受けています、そして、我々はそれを解析します.
ノードですが.JSはコマンドライン引数を扱うための組み込み機能を提供しますyargs 🏴☠ 特にCLIを構築するために
S . Yargsは、引数の解析の我々のプロセスを簡素化し、コマンドラインフラグを整理するのに役立ちます.
~$npm i yargs
インストールした後、モジュールをindex.js
:~$const yargs = require("yargs");
3 .次に、options
すべてのコマンドラインフラグを含むオブジェクト:const usage = "\nUsage: tran <lang_name> sentence to be translated";const options = yargs
.usage(usage)
.option("l", {alias:"languages", describe: "List all supported languages.", type: "boolean", demandOption
: false })
.help(true)
.argv;
上記のコードでは-l
渡されると、APIによってサポートされているすべての言語を出力します.糸は我々を提供する--help
and --version
デフォルトのフラグ.オプションを強制的に設定したい場合は
demandOption
値true
, これはYARGSを投げる
Missing argument
フラグが指定されていない場合にエラーとなります.テスト:
いいね
All the arguments that you pass with the command gets stored under the list
yargs.argv._
unless the argument begin with a—
or a--
in that case, it is treated as a flag with a default value of boolean. You can console.logyargs.argv
to get a better picture of how the arguments are stored.
渡されたフラグの値を
yargs.argv.flagname
.ユーティリティ関数の追加
今ではユーティリティ機能を追加する時間です.
以下のように入力します.
~$tran lang_name the sentence to be translated
それで、引数を解析する必要があります.我々はすべてのユーティリティ機能を書くことができます
index.js
しかし、それはきちんとしているように見えませんutils.js
すべての関数について.以下に必要なことを示します.utils.js
にbin
フォルダ.index.js
:const utils = require('./utils.js')
3 .文を解析する関数を作成します.関数を書き込む
utils.js
それからエクスポートします:module.exports = { parseSentence: parseSentence };function parseSentence(words) {
var sentence = "";
for(var i = 1; i < words.length; i++) {
sentence = sentence + words[i] + " ";
}
それを呼ぶindex.js
:var sentence = utils.parseSentence(yargs.argv._);
引数を渡さないときにヘルプを表示する関数を作成します.関数を作成する
utils.js
:module.exports = { showHelp: showHelp, parseSentence: parseSentence };const usage = "\nUsage: tran <lang_name
> sentence to be translated";
function showHelp() {
console.log(usage);
console.log('\nOptions:\r')
console.log('\t--version\t ' + 'Show version number.' + '\t\t' + '[boolean]\r')
console.log(' -l, --languages\t' + ' ' + 'List all languages.' + '\t\t' + '[boolean]\r')
console.log('\t--help\t\t ' + 'Show help.' + '\t\t\t' + '[boolean]\n')
}
それを呼ぶindex.js
:if(yargs.argv._[0] == null){
utils.showHelp();
return;
}
5 .関数を書き込むutils.js
サポートされているすべての言語を表示するには、次の手順にmodule.exports = { showAll: showAll, showHelp: showHelp, parseSentence: parseSentence};
function showAll(){
console.log(chalk.magenta.bold("\nLanguage Name\t\tISO-639-1 Code\n"))
for(let [key, value] of languages) {
console.log(key + "\\t\\t" + value + "\\n")
}
}
let languages = new Map();
languages.set('afrikaans', 'af')
languages.set('albanian', 'sq')
languages.set('amharic', 'am')
languages.set('arabic', 'ar')
languages.set('armenian', 'hy')
languages.set('azerbaijani', 'az')
languages.set('basque', 'eu')
languages.set('belarusian', 'be')
languages.set('bengali', 'bn')
languages.set('bosnian', 'bs')
languages.set('bulgarian', 'bg')
languages.set('catalan', 'ca')
languages.set('cebuano', 'ceb')
languages.set('chinese', 'zh')
languages.set('corsican', 'co')
languages.set('croatian', 'hr')
languages.set('czech', 'cs')
languages.set('danish', 'da')
languages.set('dutch', 'nl')
languages.set('english', 'en')
languages.set('esperanto', 'eo')
languages.set('estonian', 'et')
languages.set('finnish', 'fi')
languages.set('french', 'fr')
languages.set('frisian', 'fy')
languages.set('galician', 'gl')
languages.set('georgian', 'ka')
languages.set('german', 'de')
languages.set('greek', 'el')
languages.set('gujarati', 'gu')
languages.set('haitian creole', 'ht')
languages.set('hausa', 'ha')
languages.set('hawaiian', 'haw') // (iso-639-2)
languages.set('hebrew', 'he') //or iw
languages.set('hindi', 'hi')
languages.set('hmong', 'hmn') //(iso-639-2)
languages.set('hungarian', 'hu')
languages.set('icelandic', 'is')
languages.set('igbo', 'ig')
languages.set('indonesian', 'id')
languages.set('irish', 'ga')
languages.set('italian', 'it')
languages.set('japanese', 'ja')
languages.set('javanese', 'jv')
languages.set('kannada', 'kn')
languages.set('kazakh', 'kk')
languages.set('khmer', 'km')
languages.set('kinyarwanda', 'rw')
languages.set('korean', 'ko')
languages.set('kurdish', 'ku')
languages.set('kyrgyz', 'ky')
languages.set('lao', 'lo')
languages.set('latin', 'la')
languages.set('latvian', 'lv')
languages.set('lithuanian', 'lt')
languages.set('luxembourgish', 'lb')
languages.set('macedonian', 'mk')
languages.set('malagasy', 'mg')
languages.set('malay', 'ms')
languages.set('malayalam', 'ml')
languages.set('maltese', 'mt')
languages.set('maori', 'mi')
languages.set('marathi', 'mr')
languages.set('mongolian', 'mn')
languages.set('burmese', 'my')
languages.set('nepali', 'ne')
languages.set('norwegian', 'no')
languages.set('nyanja', 'ny')
languages.set('odia', 'or')
languages.set('pashto', 'ps')
languages.set('persian', 'fa')
languages.set('polish', 'pl')
languages.set('portuguese', 'pt')
languages.set('punjabi', 'pa')
languages.set('romanian', 'ro')
languages.set('russian', 'ru')
languages.set('samoan', 'sm')
languages.set('scots', 'gd')//gd gaelic
languages.set('serbian', 'sr')
languages.set('sesotho', 'st')
languages.set('shona', 'sn')
languages.set('sindhi', 'sd')
languages.set('sinhalese', 'si')
languages.set('slovak', 'sk')
languages.set('slovenian', 'sl')
languages.set('somali', 'so')
languages.set('spanish', 'es')
languages.set('sundanese', 'su')
languages.set('swahili', 'sw')
languages.set('swedish', 'sv')
languages.set('tagalog', 'tl')
languages.set('tajik', 'tg')
languages.set('tamil', 'ta')
languages.set('tatar', 'tt')
languages.set('telugu', 'te')
languages.set('thai', 'th')
languages.set('turkish', 'tr')
languages.set('turkmen', 'tk')
languages.set('ukrainian', 'uk')
languages.set('urdu', 'ur')
languages.set('uyghur', 'ug')
languages.set('uzbek', 'uz')
languages.set('vietnamese', 'vi')
languages.set('welsh', 'cy')
languages.set('xhosa', 'xh')
languages.set('yiddish', 'yi')
languages.set('yoruba', 'yo')
languages.set('zulu', 'zu')
ここでは、ISO - 639 - 1コードにすべての言語名をマップするためにハッシュマップを作成しました.これは、2つの目的のために、最初にそれが必要なときにすべての言語を表示するのを助けるでしょう、第2に、APIが言語コードをとるだけであるので、ユーザーが言語名に入っても、我々はAPIにそれを渡す前に言語コードでそれを交換することができます.こっそり!🤫. スワップはハッシュマップを使用しているので、一定時間になります.呼び出し
showAll()
あなたの関数index.js
if the -l
or -languages
フラグがtrueです.if(yargs.argv.l == true || yargs.argv.languages == true){
utils.showAll();
return;
}
6 .私たちがあなたの中で話した汚い行いをするために、関数を書きなさいutils.js
:module.exports = { parseLanguage: parseLanguage, showAll: showAll, showHelp: showHelp, parseSentence: parseSent
ence };
function parseLanguage (language) {
if(language.length == 2){
return language;
}
if(languages.has(language)){
return languages.get(language)
}
else {
console.error("Language not supported!")
return; //returning null if the language is unsupported.
}
};
言語を小文字に変換し、index.js
if(yargs.argv._[0])
var language = yargs.argv._[0].toLowerCase(); // stores the language.
//parsing the language specified to the ISO-639-1 code.
language = utils.parseLanguage(language);
7 .文が空であるかどうかを調べます.APIをあなたのトップに含めてください
index.js
:const translate = require('[@vitalets/google-translate-api](http://twitter.com/vitalets/google-translate-api)')
;if(sentence == ""){
console.error("\nThe entered sentence is like John Cena, I can't see it!\n")
console.log("Enter tran --help to get started.\n")
return;
}translate(sentence, {to: language}).then(res => {console.log("\n" + "\n" + res.text + "\n" + "\n";}).catch
(err => {
console.error(err);
});
あなたのCLIは今完了です!あなたがすることができる1つのことは、ボックスと色で出力とエラーを飾ることですboxen and chalk .ボクセンとチョークを用いた美化
端末の色を使用することができますchalk ボックスを使用して出力を飾るboxen .
npm install chalk boxen
2 .それらを含めるindex.js
and utils.js
const chalk = require('chalk');
const boxen = require('boxen');
3 .使用定数に色を追加します.const usage = chalk.hex('#83aaff')("\\nUsage: tran <lang\_name> sentence to be translated");
4 .美しい箱を使って出力を表示します.translate(sentence, {to: language}).then(res => {console.log("\n" + boxen(chalk.green("\n" + res.text + "\n"
), {padding: 1, borderColor: 'green', dimBorder: true}) + "\n");}).catch(err => {
console.error(err);
});
パッケージの両方を試してみて、あなたの心の内容にカスタマイズを加えてください.そのすべての栄光のCLI
ああはい
私が楽しみをたくさん持っていたので、あなた自身が、そして、完全に携帯用のCLIを造る方法を学ぶことを楽しんでください.
ハッピーコーディング!
このための完全なコードは次のとおりです.https://github.com/RushanKhan1/termTranslate
フォークミーオンGithub たぶん
私と接続してください.
編集:このポストは、現在も注目されますHackernoon .
Reference
この問題について(ノードを指定してCLIをビルドします.js), 我々は、より多くの情報をここで見つけました https://dev.to/rushankhan1/build-a-cli-with-node-js-4jbiテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol