序文最近、小さなバージョンをテストするときにバージョン番号を変更するのを忘れました。そこで、パッケージ化する前にバージョン番号を要求し、バージョンの説明にバージョン番号を入力することを思いつきました。最終的な効果は、bat ファイルをダブルクリックすると、ターミナルにバージョン番号を入力するように求められ、入力後にバージョン番号が保存されることです。 バッチ処理でもできますが、js で書いた方が便利なので、js で処理することにしました。 このプロセスは4つのステップに分かれています
簡単に言うと、パッケージ化のためのパッケージ化コマンドをトリガーするには、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を直接参照できます。
gulp コマンドからバージョン番号を取得することもできます。 var ミニミスト = require('ミニミスト'); var argv = minimist(process.argv.slice(2), { 文字列: ["名前"] }); console.log(argv.buildVersion) もっとよく見てみましょう。 要約するこれで、readline を使用して入力内容を促す nodejs に関するこの記事は終了です。関連する nodejs readline プロンプト入力内容の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: VMware インストール エラー VMware Workstation が VMware 認証サービスを開始できませんでした
序文:親コンポーネントと子コンポーネント間でデータを渡す場合、通常は props と emittin...
目次序文1. エンドポイント2. 接続ハンドラ3. コヨーテ4. コンテナ責任チェーンパターン序文T...
<script> タグHTML5では、スクリプトには次の属性があります: async、d...
記録として、将来使用される可能性があり、困っている友人も使用できます。 BBはもうやめて、まずはレン...
Python 3.4でMySQLデータベースを使用する詳細なプロセスは次のとおりです。 Window...
序文プロジェクト内のパズルゲーム(デジタル華容路とも呼ばれる)を再構築するのに 2 日かかりました。...
目次1. テスト実験2. 制限ページング問題に対するパフォーマンス最適化手法2.1 テーブルをカバー...
HTML と XHTML の違い1. XHTML要素は正しくネストされている必要がある2. XHT...
この記事の例では、Element+vueを使用して開始と終了の時間制限を実装するための具体的なコード...
目次1. 通常の機能2. 矢印関数3. データパケットJSON 4. オブジェクト5. 約束6. 非...
1. 数学関数ABS(x) xの絶対値を返します。 BIN(x) xの2進値を返します(OCTは8...
序文この記事は主にMySQLの主キー0と主キー自己排除制約の関係を紹介し、皆さんの参考と学習のために...
1. GitLabの紹介Gitlab 公式アドレス: https://about.gitlab.co...
テーブル ヘッダーが固定されている場合は、それを 2 つのテーブルに分割する必要があります。1 つの...
背景下のようなリストでは、削除ボタンをクリックすると削除操作を実行する必要があります。 リスト生成:...