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

推薦する

Vue3 における provide と inject の使用法と原則

序文:親コンポーネントと子コンポーネント間でデータを渡す場合、通常は props と emittin...

Webリクエストと処理のTomcatソースコード分析

目次序文1. エンドポイント2. 接続ハンドラ3. コヨーテ4. コンテナ責任チェーンパターン序文T...

HTML で JavaScript を使用する

<script> タグHTML5では、スクリプトには次の属性があります: async、d...

HTML+CSS を使用して、画像の右上隅に削除の十字と画像削除ボタンを追加します。

記録として、将来使用される可能性があり、困っている友人も使用できます。 BBはもうやめて、まずはレン...

Windows 7 で Python 3.4 を使って MySQL データベースを使用する

Python 3.4でMySQLデータベースを使用する詳細なプロセスは次のとおりです。 Window...

vue3 を使用したジグソーパズルゲームのリファクタリングの例

序文プロジェクト内のパズルゲーム(デジタル華容路とも呼ばれる)を再構築するのに 2 日かかりました。...

制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?

目次1. テスト実験2. 制限ページング問題に対するパフォーマンス最適化手法2.1 テーブルをカバー...

HTMLとXHTML、HTML4とHTML5のタグの違いについて簡単に紹介します。

HTML と XHTML の違い1. XHTML要素は正しくネストされている必要がある2. XHT...

Element+vueを使用して開始時間と終了時間の制限を実装する

この記事の例では、Element+vueを使用して開始と終了の時間制限を実装するための具体的なコード...

JavaScript 関数構文の説明

目次1. 通常の機能2. 矢印関数3. データパケットJSON 4. オブジェクト5. 約束6. 非...

よく使用される MySQL 関数の完全なリスト (分類および要約)

1. 数学関数ABS(x) xの絶対値を返します。 BIN(x) xの2進値を返します(OCTは8...

MySQL における主キーが 0 であることと主キーの自己選択制約の関係についての詳しい説明 (詳細)

序文この記事は主にMySQLの主キー0と主キー自己排除制約の関係を紹介し、皆さんの参考と学習のために...

Docker-compose ワンクリックデプロイ gitlab 中国語版の方法手順

1. GitLabの紹介Gitlab 公式アドレス: https://about.gitlab.co...

HTMLの表のtbodyは上下左右にスライドできます

テーブル ヘッダーが固定されている場合は、それを 2 つのテーブルに分割する必要があります。1 つの...

React onClickにパラメータを渡す問題について話しましょう

背景下のようなリストでは、削除ボタンをクリックすると削除操作を実行する必要があります。 リスト生成:...