VorwortKürzlich habe ich beim Testen einer kleinen Version vergessen, die Versionsnummer zu ändern. Dann kam mir die Idee, vor dem Verpacken nach der Versionsnummer zu fragen und diese dann in die Versionsbeschreibung einzutragen. Der endgültige Effekt besteht darin, dass Sie durch einen Doppelklick auf die Bat-Datei aufgefordert werden, die Versionsnummer im Terminal einzugeben, und die Versionsnummer wird nach der Eingabe gespeichert. Obwohl dies auch mit der Stapelverarbeitung möglich ist, ist es bequemer, es in JS zu schreiben, daher wird JS für die Verarbeitung gewählt. Der Prozess gliedert sich in vier Schritte
Einfach ausgedrückt: Verwenden Sie eine Bat-Datei, um den Verpackungsbefehl zum Verpacken auszulösen. 1. bat führt js ausErstellen Sie zunächst zwei Dateien: buildVersion.bat und buildVersion.js. Verwenden Sie einen Knoten, um die JS-Datei in buildVersion.bat auszuführen @echo aus setze curpath=%~dp0 %curpath%nodejs\node.exe %curpath%buildVersion.js Pause %~dp0 ist das aktuelle Verzeichnis. Sie können auch Parameter nach js übergeben, wie zum Beispiel --buildType default 2. Das Terminal fordert Sie auf, die Versionsnummer einzugeben und den Verpackungsbefehl auszuführenVerwenden Sie readline, um den Frage-und-Antwort-Effekt zu erzielen, und verwenden Sie dann child_process, um die gepackte Befehlszeile auszuführen. Rufen Sie die Datei buildVersion.js auf und schreiben Sie zunächst einen einfachen Eingabeaufforderungseffekt. const readline = erforderlich('readline'); const rl = readline.createInterface({ Eingabe: process.stdin, Ausgabe: process.stdout, }); rl.question(`Bitte geben Sie die neue Versionsnummer ein: `, (Name) => { }); Dadurch wird nicht der gewünschte Effekt erzielt. Wir zeigen zuerst die vorherige Versionsnummer an, fragen dann nach einer neuen Versionsnummer und wenn die Eingabe leer ist, wird die vorherige Versionsnummer verwendet. // Versionsinformationen abrufen, die im dritten Schritt implementiert werden var versionInfo; const versionInfoUrl = './src/config/version/version.js'; Funktion getVersion() { var BuildVersion = ""; versuchen { versionInfo = erforderlich(versionInfoUrl); BuildVersion = Versionsinfo.Version; } Fehler abfangen { } BuildVersion zurückgeben; } Die Eingabeaufforderung sieht folgendermaßen aus const chalk = require('chalk'); // Farbbibliothek importieren rl.question(`${chalk.cyan("Aktuelle Versionsnummer: ")}${chalk.bold.red(getVersion())} \nBitte geben Sie die neue Versionsnummer ein: `, (name) => { !name && (name=versionInfo?versionInfo.version:""); console.log(`${chalk.cyan("Die neue Versionsnummer ist: ")}${chalk.bold.yellow(name)}`); Die Auswirkung auf das Terminal ist Manchmal steht vor der Versionsnummer ein festes Präfix. Dieses zeigen wir bei der Eingabeaufforderung an und können von Ihnen nach Belieben gelöscht werden. // Standardwert schreiben rl.write("Version") Der nächste Schritt besteht darin, den Verpackungsbefehl auszuführen. Das aktuelle Projekt wird mit Gulp gepackt. Um die Eingabeaufforderung von Gulp im Terminal anzuzeigen, verwenden Sie child_process.spawn // Analysieren Sie die von der Bat-Operation übergebenen Parameter. var minimist = require('minimist'); var argv = minimist(prozess.argv.slice(2), { Zeichenfolge: ["Name"] }); const untergeordneter Prozess = erforderlich('untergeordneter Prozess'); rl.question(`${chalk.cyan("Aktuelle Versionsnummer: ")}${chalk.bold.red(getVersion())} \nBitte geben Sie die neue Versionsnummer ein: `, (name) => { !name && (name=versionInfo?versionInfo.version:""); console.log(`${chalk.cyan("Die neue Versionsnummer ist: ")}${chalk.bold.yellow(name)}`); // Notieren Sie die neue Versionsnummer changeVersion(name); var buildType = argv.buildType || "build" // Der Befehl wird in Gulp konfiguriert var gulpCmd = `gulp ${buildType} --buildVersion "${name}" --color --f ${__dirname}/gulpfile.js`; Konsole.log(gulpCmd); let spawnProcess = child_process.spawn(gulpCmd, [], { Shell: wahr }); spawnProcess.stdout.on('Daten', (Daten) => { Konsole.log(`${data.toString()}`); }); spawnProcess.stderr.on('Daten', (Daten) => { console.log(`stderror: ${data}`); }); spawnProcess.on('schließen', (Code) => { wenn (Code !== 0) { console.log(`schließen: $[code]`); } }); spawnProcess.on('beenden', (Code) => { // console.log(`exit: ${code.toString()}`); console.log(chalk.bold.yellow("----------------- Abgeschlossen --------------------")); }); }); Funktion changeVersion(params) { if (versionInfo && versionInfo.changeVersion) { versionInfo.changeVersion(params); } } Die Auswirkung auf das Terminal ist Mit anderen Verpackungswerkzeugen ist dies möglich let exec = require('Unterprozess').execSync; exec('vue-cli-service --mode dev build', { stdio: "erben" }); 3. Ändern Sie die VersionsnummerndateiUm die Datei zu ändern, dachte ich daran, fs.writeFile zum Schreiben der Datei zu verwenden, aber das ist gut für das JSON-Format, aber nicht praktisch für die Verarbeitung von JS-Dateien. Daher speichere ich die Versionsinformationen separat in einer JSON-Datei. Erstellen Sie zwei Dateien: version.js und version.json. var VersionInfoJson; // Da in HTML darauf verwiesen werden kann, wird eine Unterscheidung vorgenommen, wenn (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { getVersionInfo(true); } anders { wenn (Typ der Definition === 'Funktion' und definieren.amd) { getVersionInfo(false); } anders { getVersionInfoLocal(); } } Funktion getVersionInfo(isModule) { versuchen { VersionInfoJson = erfordern("./version.json"); } Fehler abfangen { VersionInfoJson = {}; } VersionInfoJson.buildTime = getNowFormatDate(); VersionInfoJson.changeVersion = Version ändern; wenn (istModul) { module.exports = VersionInfoJson; }anders{ definieren([], Funktion () { VersionInfoJson zurückgeben; }); } } asynchrone Funktion getVersionInfoLocal() { versuchen { VersionInfoJson = warte auf getVersionJson(); } Fehler abfangen { VersionInfoJson = {}; } VersionInfoJson.buildTime = getNowFormatDate(); Fenster.VersionInfo = VersionInfoJson; } Funktion getVersionJson() { returniere neues Promise((lösen, ablehnen)=>{ var request = neue XMLHttpRequest(); Anfrage.öffnen("get", "config/version/version.json"); Anfrage.senden(null); Anfrage.onload = Funktion () { wenn (Anfrage.Status == 200) { var json = JSON.parse(Anfrage.AntwortText); lösen (json); }anders{ var json = {}; lösen (json); } } }); } Funktion changeVersion(version) { var KopiereVersion = cloneObj(VersionInfoJson); KopiereVersion.version = Version; if (Version kopieren.hasOwnProperty("Version ändern")) { löschen copyVersion["changeVersion"] } // console.log(Kopierversion, __Verzeichnisname, __Dateiname) lass fs = erfordern('fs'); fs.writeFile(__dirname + "/version.json", JSON.stringify(copyVersion), (err) => { }); } // 1. Verwenden Sie „new obj.constructor()“, um ein leeres Objekt zu erstellen, anstatt {} oder [] zu verwenden, um die Vererbung der Prototypenkette beizubehalten. // 2. Verwenden Sie obj.hasOwnProperty(key), um zu bestimmen, ob die Eigenschaft aus der Prototypenkette stammt, da for..in.. auch die aufzählbaren Eigenschaften in seiner Prototypenkette durchläuft. // 3. Die obige Funktion verwendet einen rekursiven Algorithmus. Wenn die Funktion einen Namen hat und sich dieser Name in Zukunft nicht ändert, gibt es mit dieser Definition kein Problem. Das Problem besteht jedoch darin, dass die Ausführung dieser Funktion eng an den Funktionsnamen Fakultät gekoppelt ist. Um diese enge Kopplung zu beseitigen, verwenden Sie arguments.callee. Funktion KlonObj(Objekt) { wenn (obj === null) return null wenn (Typ des Objekts !== 'Objekt') returniere Objekt; wenn (Objekt.Konstruktor === Datum) neues Datum(Objekt) zurückgeben; wenn (Objekt.Konstruktor === RegExp) neues RegExp(Objekt) zurückgeben; var newObj = new obj.constructor(); //behalte die Vererbungskette für (var key in obj) { if (obj.hasOwnProperty(key)) { //Die Eigenschaften in der Prototypenkette nicht durchlaufen var val = obj[key]; newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // Verwenden Sie arguments.callee, um sich vom Funktionsnamen zu entkoppeln} } gib neuesObjekt zurück; } Funktion getNowFormatDate() { var date = neues Datum(); var seperator1 = "-"; // Jahr-, Monat-, Tagesintervall var seperator2 = ":"; // Stunde-, Minute-, Sekundenintervall var month = date.getMonth() + 1; var strDate = date.getDate(); wenn (Monat >= 1 und Monat <= 9) { Monat = "0" + Monat; } wenn (strDate >= 0 und strDate <= 9) { strDate = "0" + strDate; } var currentdate = date.getFullYear() + seperator1 + monat + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds(); aktuelles Datum zurückgeben; } 4. Gulp liest die JSON-Datei mit der Versionsnummer Dieser Schritt ist einfach. Sie können direkt auf JSON verweisen.
Sie können die Versionsnummer auch über den Gulp-Befehl abrufen. var minimist = erforderlich('minimist'); var argv = minimist(prozess.argv.slice(2), { Zeichenfolge: ["Name"] }); Konsole.log(argv.BuildVersion) Schauen Sie genauer hin. ZusammenfassenDies ist das Ende dieses Artikels über die Verwendung von Readline durch NodeJS zur Eingabeaufforderung von Inhalten. Weitere verwandte NodeJS-Readline-Eingabeaufforderungsinhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: VMware-Installationsfehler: VMware Workstation konnte VMware Authorization Service nicht starten
>>: Ein praktischer Bericht über die Wiederherstellung einer MySQL Slave-Bibliothek
Inhaltsverzeichnis Installieren Grundlegende Konf...
Es handelt sich hauptsächlich um ein CSS-Stilsteue...
[Lösung 1: Padding-Implementierung] Prinzip: Wenn...
1. Vue – Das erste Vue-CLI-Programm Die Entwicklu...
Das <label>-Tag definiert eine Bezeichnung (...
In diesem Artikelbeispiel wird der spezifische Co...
1 Einleitung Ein guter Programmierer sollte über ...
Abgeleitete Tabellen Wenn die Hauptabfrage eine a...
1. Einleitung MDL-Sperren in MySQL haben schon im...
Beispiel: Wir verwenden den Python-Code loop_hell...
Im Linux-System gibt es einen Dateityp namens Lin...
Inhaltsverzeichnis 1. Grundlegende Verwendung 2. ...
Inhaltsverzeichnis Warum benötigen Datenbanken In...
Ein Kollege hat mir einmal gesagt, ich solle eine...
1. Vorbereitung des Installationspakets VMware-pl...