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スレーブライブラリの復元の実践記録

推薦する

Mybatis での動的 SQL ステートメント分析

この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常...

jsを呼び出すいくつかの方法が整理され、使用が推奨されています

a タグではクリック イベントがよく使用されます。 1. href="javascript...

更新SQL文に基づくMySQLロックの理解

序文MySQL データベース ロックは、データの一貫性を実現し、同時実行性の問題を解決するための重要...

Alibaba CloudにMySQLをインストールする方法の詳細な説明

軽量のオープンソース データベースである MySQL は、エンタープライズ レベルのアプリケーション...

Linuxの簡単な分析でファイアウォールの状態と外部に開いているポートの状態を確認する

1. ファイアウォールの状態を確認するファイアウォールのステータスを確認する systemctl s...

JavaScript 配列重複排除問題の詳細な研究

目次序文 👀リサーチを始めましょう🐱‍🏍オリジナル🧶 indexOf を使用した元の方法の最適化 ✍...

TCPソケットSYNキューとAcceptキューの差異分析

まず、「LISTENING」状態の TCP ソケットには 2 つの独立したキューがあることを理解する...

Reactはtodolistの追加、削除、変更、クエリを実装します

目次ToDoリストを例に挙げましょうディレクトリは次のとおりですアプリ入力.jsリスト.jsアイテム...

TypeScriptの基本型の詳細な説明

目次ブール型数値型文字列型文字列と数値を連結する未定義およびnull配列型タプル型列挙型あらゆるタイ...

上位Nを見つけるためのMySQLグループソートの詳細な説明

MySQLグループソートで上位Nを見つけるテーブル構造grp でグループ化し、num で並べ替えて、...

SQL ステートメント実行の詳細な説明 (MySQL アーキテクチャの概要 -> クエリ実行プロセス -> SQL 解析順序)

序文:私はずっと、SQL 文がどのように、どのような順序で実行されるのかを知りたいと思っていました。...

Ubuntu 18.04 (物理マシン) で OpenWRT 開発環境を構成する方法

1. 仮想マシン(物理マシン)をインストールする仮想マシンまたは物理マシンにインストールできます。 ...

MySQL 5.7.17 圧縮パッケージのインストール不要の構成プロセス図

MySQL データベース管理ソフトウェアには、エンタープライズ エディションとコミュニティ エディシ...

透明な入力ボックスにアイコンを追加する HTML コード

最近、弁護士推薦のウェブサイトを作成していたのですが、検索ボックスに問題がありました。検索ボックス内...

きちんとした標準的なHTMLタグの書き方を学ぶ

優れた HTML コードは美しい Web サイトの基礎となります。私が CSS を教えるときは、まず...