Nodejs は readline を使用してコンテンツ入力を促すサンプルコード

Nodejs は readline を使用してコンテンツ入力を促すサンプルコード

序文

最近、小さなバージョンをテストするときにバージョン番号を変更するのを忘れました。そこで、パッケージ化する前にバージョン番号を要求し、バージョンの説明にバージョン番号を入力することを思いつきました。最終的な効果は、bat ファイルをダブルクリックすると、ターミナルにバージョン番号を入力するように求められ、入力後にバージョン番号が保存されることです。

バッチ処理でもできますが、js で書いた方が便利なので、js で処理することにしました。

このプロセスは4つのステップに分かれています

  • bat 実行 js
  • ターミナルはバージョン番号を入力してパッケージ化コマンドを実行するように要求します。
  • バージョン番号ファイルを変更する
  • gulpはバージョン番号のjsonファイルを読み取ります

簡単に言うと、パッケージ化のためのパッケージ化コマンドをトリガーするには、bat ファイルを使用します。

1. batがjsを実行する

まず、buildVersion.bat と buildVersion.js の 2 つのファイルを作成します。

node を使用して buildVersion.bat 内の js ファイルを実行します。

@エコーオフ
curpath=%~dp0 を設定します
%curpath%nodejs\node.exe %curpath%buildVersion.js
一時停止

%~dp0 は現在のディレクトリです。 --buildType defaultなどのパラメータをjsの後に渡すこともできます。

2. ターミナルにバージョン番号を入力してパッケージ化コマンドを実行するように求められます。

readline を使用して質疑応答の効果を実現し、child_process を使用してパッケージ化されたコマンド ラインを実行します。

buildVersion.js ファイルを入力し、最初に簡単なプロンプト入力効果を記述します。

readline は 'readline' を必要とします。
定数rl = readline.createInterface({
    入力: process.stdin、
    出力: process.stdout、
});
rl.question(`新しいバージョン番号を入力してください: `, (name) => {

});

これでは望ましい効果は得られません。最初に以前のバージョン番号を表示し、次に新しいバージョン番号の入力を求めます。入力が空の場合は、以前のバージョン番号が使用されます。

// 3 番目のステップで実装されるバージョン情報を取得します。var versionInfo;
定数versionInfoUrl = './src/config/version/version.js';
関数 getVersion() {
    var ビルドバージョン = "";
    試す {
        バージョン情報 = 必要(バージョン情報Url);
        ビルドバージョン = versionInfo.version;
    } キャッチ(エラー){

    }
    buildVersion を返します。
}

プロンプト入力は次のようになります

const chalk = require('chalk'); // カラーライブラリをインポート rl.question(`${chalk.cyan("現在のバージョン番号: ")}${chalk.bold.red(getVersion())} \n新しいバージョン番号を入力してください: `, (name) => {
    !name && (name=versionInfo?versionInfo.version:"");
    console.log(`${chalk.cyan("新しいバージョン番号は: ")}${chalk.bold.yellow(name)}`);

端末への影響は

バージョン番号の前に固定のプレフィックスが付いている場合があります。入力を求めるときにプレフィックスが表示され、任意に削除できます。

// デフォルト値を書き込む rl.write("Version")

次のステップは、パッケージ化コマンドを実行することです。現在のプロジェクトは gulp を使用してパッケージ化されています。ターミナルにgulpのプロンプトを表示するには、child_process.spawnを使用します。

// bat 操作によって渡されたパラメータを解析します。var minimist = require('minimist');
var argv = minimist(process.argv.slice(2), {
    文字列: ["名前"]
});

定数 child_process = require('child_process');
rl.question(`${chalk.cyan("現在のバージョン番号: ")}${chalk.bold.red(getVersion())} \n新しいバージョン番号を入力してください: `, (name) => {
    !name && (name=versionInfo?versionInfo.version:"");
    console.log(`${chalk.cyan("新しいバージョン番号は: ")}${chalk.bold.yellow(name)}`);
    //新しいバージョン番号を記録します changeVersion(name);
    
    var buildType = argv.buildType || "build" // コマンドは gulp で構成されます var gulpCmd = `gulp ${buildType} --buildVersion "${name}" --color --f ${__dirname}/gulpfile.js`;
    コンソールにログ出力します。
    spawnProcess = child_process.spawn(gulpCmd, [], {
        シェル: 真
    });
    spawnProcess.stdout.on('data', (data) => {
        コンソールにログ出力します。
    });
    spawnProcess.stderr.on('data', (data) => {
        console.log(`stderror: ${data}`);
    });
    spawnProcess.on('close', (コード) => {
        (コード!== 0)の場合{
            console.log(`close: $[code]`);
        }
    });
    spawnProcess.on('exit', (コード) => {
        // console.log(`exit: ${code.toString()}`);
        console.log(chalk.bold.yellow("----------------- 完了 --------------------"));
    });
});

関数 changeVersion(パラメータ) {
    バージョン情報とバージョン情報の変更バージョンの場合
        バージョン情報。パラメータを変更します。
    }
}

端末への影響は

他のパッケージングツールを使用すると、次のように実行できます。

exec = require('child_process').execSync; とします。
exec('vue-cli-service --mode dev build', {
    stdio: '継承'
});

3. バージョン番号ファイルを変更する

ファイルを変更するには、fs.writeFile を使用してファイルを書き込むことを考えましたが、これは json 形式には適していますが、js ファイルの処理には不便です。そのため、バージョン情報を json ファイルに別途保存します。 version.js と version.json の 2 つのファイルを作成します。

var バージョン情報 JSON;
// HTML で参照される可能性があることを考慮して、区別が行われます if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
    バージョン情報を取得します(true);
} それ以外 {
    if (typeof define === 'function' && define.amd) {
        バージョン情報を取得します(false);
    } それ以外 {
        ローカルバージョン情報を取得します。
    }
}

関数 getVersionInfo(isModule) {
    試す {
        VersionInfoJson = require("./version.json");
    } キャッチ(エラー){
        バージョン情報Json = {};
    }
    バージョン情報Json.buildTime = getNowFormatDate();
    バージョン情報Json.changeVersion = changeVersion;

    if (isModule) {
        モジュールをエクスポートします。
    }それ以外{
        定義([], 関数() {
            VersionInfoJson を返します。
        });
    }
}

非同期関数 getVersionInfoLocal() {
    試す {
        VersionInfoJson = getVersionJson() を待機します。
    } キャッチ(エラー){
        バージョン情報Json = {};
    }
    バージョン情報Json.buildTime = getNowFormatDate();
    ウィンドウのバージョン情報 = VersionInfoJson;
}

関数 getVersionJson() {
    新しい Promise を返します ((resolve, reject)=>{
        var リクエスト = 新しい XMLHttpRequest();
        リクエストを開きます("get", "config/version/version.json");
        リクエストを送信します(null);
        リクエスト.onload = 関数(){
            リクエストステータス == 200 の場合
                var json = JSON.parse(request.responseText);
                解決(json);
            }それ以外{
                var json = {};
                解決(json);
            }
        }
    });
}

関数 changeVersion(バージョン) {
    var copyVersion = cloneObj(VersionInfoJson);
    copyVersion.version = バージョン;
    copyVersion.hasOwnProperty("changeVersion") の場合 {
        copyVersion["changeVersion"] を削除
    }
    // console.log(コピーバージョン、__dirname、__filename)
    fs = require('fs'); とします。
    fs.writeFile(__dirname + "/version.json", JSON.stringify(copyVersion), (err) => {

    });
}

// 1. プロトタイプ チェーンの継承を維持するために、{} または [] を使用する代わりに、new obj.constructor () を使用して空のオブジェクトを作成します。
// 2. obj.hasOwnProperty(key) を使用して、プロパティがプロトタイプ チェーンからのものであるかどうかを判断します。これは、for..in.. がプロトタイプ チェーン上の列挙可能なプロパティも走査するためです。
// 3. 上記の関数は再帰アルゴリズムを使用しています。関数に名前があり、その名前が将来変更されない場合は、この定義に問題はありません。しかし問題は、この関数の実行が関数名 factorial と密接に結合されていることです。この密結合を排除するには、arguments.callee を使用します。
関数 cloneObj(obj) {
    (obj === null) の場合は null を返す
    if (typeof obj !== 'object') の場合は obj を返します。
    obj.constructor === Date の場合、新しい Date(obj) を返します。
    obj.constructor === RegExp の場合、新しい RegExp(obj) を返します。
    var newObj = new obj.constructor(); //継承チェーンを保持する for (var key in obj) {
        if (obj.hasOwnProperty(key)) { //プロトタイプチェーン上のプロパティを走査しない var val = obj[key];
            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 関数名から切り離すためにarguments.calleeを使用する}
    }
    新しいオブジェクトを返します。
}

関数 getNowFormatDate() {
    var date = 新しい Date();
    var seperator1 = "-"; // 年、月、日の間隔 var seperator2 = ":"; // 時間、分、秒の間隔 var month = date.getMonth() + 1;
    var strDate = date.getDate();
    (月 >= 1 && 月 <= 9) の場合 {
        月 = "0" + 月;
    }
    strDate >= 0 && strDate <= 9 の場合 {
        strDate = "0" + strDate;
    }
    var currentdate = date.getFullYear() + セパレータ1 + 月 + セパレータ1 + strDate +
        " " + date.getHours() + セパレータ2 + date.getMinutes() +
        セパレータ2 + date.getSeconds();
    現在の日付を返します。
}

4. gulpはバージョン番号のjsonファイルを読み取ります

このステップは簡単です。 jsonを直接参照できます。

定数versionInfo = require('./src/config/version/version.js');

gulp コマンドからバージョン番号を取得することもできます。

var ミニミスト = require('ミニミスト');
var argv = minimist(process.argv.slice(2), {
    文字列: ["名前"]
});

console.log(argv.buildVersion)

もっとよく見てみましょう。

要約する

これで、readline を使用して入力内容を促す nodejs に関するこの記事は終了です。関連する nodejs readline プロンプト入力内容の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ファイルの内容を行ごとに読み書きする Node.js readline の例
  • Node.jsはreadlineモジュールを使用して入力と出力を実装します
  • Node.jsのreadlineモジュールの使い方の詳しい説明
  • Node.js API の readline モジュールの使用方法の詳細な説明
  • Node.jsのreadlineモジュールとutilモジュールの使用

<<:  VMware インストール エラー VMware Workstation が VMware 認証サービスを開始できませんでした

>>:  MySQLスレーブライブラリの復元の実践記録

推薦する

ウェブページの読み込み速度を上げる簡単なヒント

Web ページの読み込み速度は、Web サイトの品質を評価するための重要な指標です。その理由は、ほと...

Ubuntu 20.04でLNMP環境を構築する方法

簡単な説明以前 Centos7 で構築し、その後個人開発環境として Ubuntu 20.04 を使っ...

jQueryは記事の折りたたみと展開の機能を実装します

この記事の例では、記事の折りたたみと展開の機能を実現するためのjQueryの具体的なコードを参考まで...

Dockerのyumソースの設定とCentOS7へのインストールの詳細な説明

ここではCentOS7が使用されており、カーネルバージョンは [root@localhost ~]#...

リバースプロキシ設定を実装するためのユニバーサルnginxインターフェース

1. プロキシサーバーとは何ですか?プロキシ サーバーは、クライアントが要求を送信すると、それを直接...

MySQL デッドロック シナリオ例の分析

序文最近、MySQL で RR レベルでデッドロック問題に遭遇しました。興味深いと思ったので、調べて...

CSS でよく使用されるフォントサイズ、フォント単位、行の高さの詳細な説明

px(ピクセル)ピクセルという言葉は皆さんもよくご存知だと思います。次に、この単位に関するちょっとし...

MySQLの明示的な型変換の簡単な分析

CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...

Linuxコマンド履歴の調整方法の詳細な説明

Linux システムの bash history コマンドは、以前に実行したコマンドを記憶し、再入力...

Linux環境にJDK1.8をインストールする

目次1. インストール環境2. インストール手順ステップ1: インストールパッケージをダウンロードす...

CSSアニメーションとSVGを組み合わせてエネルギーの流れの効果を作成する

最終的な効果は次のようになります。アニメーションは2つのステップに分かれていますランニング軌道を開発...

MySQL グラフィカル管理ツール Navicat のインストール手順

目次序文1. 全員にインストールパッケージを用意する2. Navicatをインストールし、Navic...

W3C チュートリアル (7): W3C XSL アクティビティ

スタイル シートは、ドキュメントの表示方法、発音方法、または入力方法を記述します。XSL 言語は、X...

MySQL システム ユーザーが開くことができるファイルの最大数に関する簡単な説明

本から学ぶことは常に浅はかで、これがさらなるダウンタイムを引き起こすことには決して気づきません......

VMware Workstation Pro 16 グラフィックチュートリアル (CentOS8 仮想マシン クラスタの構築)

目次準備VMware Workstation Pro 16 をインストールするLinux仮想マシンの...