ノードを指定してCLIをビルドします.js


コマンドラインユーティリティは、これまでに作成された最も基本的で美しいアプリ、すべてを開始したアプリです.
我々は、それがgit、grep、awk、NPM、または他の端末アプリであるかどうか、コマンドラインユーティリティを使用します.クリスは、通常、何かを成し遂げる最速の方法です.あなたの特定のワークフローの何かを何度も繰り返して行う必要がありますか?チャンスは、CLIで自動化することができます.
私たちは使用するつもりですNode.js それがタイトル自体から明らかでないならば、我々のCLIを作るために.なぜ?ノードですから.JS生態系は我々が何をしようとしているかを達成するために利用できる非常に便利なパッケージの何千も持っています.それが何をしようとしているとしても、それにはパッケージが存在する可能性が高いnpm , また、ノードは組み込みのライブラリを持っていて、ファイルを処理したり、他のアプリケーションを起動したり、テストをアサートしたりすることがたくさんあります.JSは非常に移植性があります.そして、彼らが異なるOSSにインストールするのが簡単であるということを意味します.
このチュートリアルの目的のために、言語間で翻訳する簡単なCLIを構築します.文字列型引数を受け取り、それらを文に解析し、翻訳APIを翻訳し、結果を表示します.このための完全なコードはGithub repository . 右に飛び込みましょう!

必要条件
CLIを作成するために必要なツールは以下のようになります.
  • 最近のバージョンNode.js インストール.
  • テキストエディタ.
  • そして、それはおそらくそれです.

    プロジェクトの設定
    基本的なノードを設定します.JSプロジェクト
  • 端末を開きます.
  • 2 .プロジェクトのフォルダを作成します.
    ~$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 a shebang line or a bang 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 デフォルトのフラグ.
    オプションを強制的に設定したい場合はdemandOptiontrue , これはYAR
    GSを投げるMissing argument フラグが指定されていない場合にエラーとなります.
    テスト:

    いいね

    All the arguments that you pass with the command gets stored under the listyargs.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.log yargs.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.jsbin フォルダ.
  • ファイルをインクルードする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 .
  • チョークと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 .