Hinweis: Dieser Ansatz ändert Ihre Einstellungen im laufenden Betrieb. package.json
Verwenden Sie ihn, wenn Sie keine Alternative haben.
Ich musste Befehlszeilenargumente an meine Skripte übergeben, die ungefähr so aussahen:
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
Das heißt, ich starte meine App mit npm run start
.
Wenn ich nun einige Argumente übergeben möchte, würde ich vielleicht mit Folgendem beginnen:
npm run start -- --config=someConfig
Dies bedeutet : npm run build && npm run watch -- --config=someConfig
. Das Problem dabei ist, dass die Argumente immer an das Ende des Skripts angehängt werden. Dies bedeutet, dass alle verketteten Skripte diese Argumente nicht erhalten (Argumente werden möglicherweise von allen benötigt oder nicht, aber das ist eine andere Geschichte.). Wenn die verknüpften Skripte aufgerufen werden, erhalten diese Skripte nicht die übergebenen Argumente. dh Das watch
Skript erhält die übergebenen Argumente nicht.
Die Produktionsnutzung meiner App ist wie folgt: Das .exe
Übergeben der Argumente in der Exe funktioniert also einwandfrei, aber wenn Sie dies während der Entwicklung tun möchten, wird es problematisch.
Ich konnte keinen richtigen Weg finden, um dies zu erreichen, also habe ich es versucht.
Ich habe eine Javascript-Datei erstellt: start-script.js
Auf der übergeordneten Ebene der Anwendung habe ich eine "default.package.json" und anstelle von "package.json" die Datei "default.package.json". Der Zweck von start-script.json
besteht darin default.package.json
, die übergebenen Argumente zu lesen , zu extrahieren scripts
und zu suchen und npm run scriptname
dann an diese Skripte anzuhängen. Danach wird eine neue erstellt package.json
und die Daten aus default.package.json mit geänderten Skripten kopiert und dann aufgerufen npm run start
.
const fs = require('fs');
const { spawn } = require('child_process');
// open default.package.json
const defaultPackage = fs.readFileSync('./default.package.json');
try {
const packageOb = JSON.parse(defaultPackage);
// loop over the scripts present in this object, edit them with flags
if ('scripts' in packageOb && process.argv.length > 2) {
const passedFlags = ` -- ${process.argv.slice(2).join(' ')}`;
// assuming the script names have words, : or -, modify the regex if required.
const regexPattern = /(npm run [\w:-]*)/g;
const scriptsWithFlags = Object.entries(packageOb.scripts).reduce((acc, [key, value]) => {
const patternMatches = value.match(regexPattern);
// loop over all the matched strings and attach the desired flags.
if (patternMatches) {
for (let eachMatchedPattern of patternMatches) {
const startIndex = value.indexOf(eachMatchedPattern);
const endIndex = startIndex + eachMatchedPattern.length;
// save the string which doen't fall in this matched pattern range.
value = value.slice(0, startIndex) + eachMatchedPattern + passedFlags + value.slice(endIndex);
}
}
acc[key] = value;
return acc;
}, {});
packageOb.scripts = scriptsWithFlags;
}
const modifiedJSON = JSON.stringify(packageOb, null, 4);
fs.writeFileSync('./package.json', modifiedJSON);
// now run your npm start script
let cmd = 'npm';
// check if this works in your OS
if (process.platform === 'win32') {
cmd = 'npm.cmd'; // https://github.com/nodejs/node/issues/3675
}
spawn(cmd, ['run', 'start'], { stdio: 'inherit' });
} catch(e) {
console.log('Error while parsing default.package.json', e);
}
Anstatt es zu tun npm run start
, tue ich es jetztnode start-script.js --c=somethis --r=somethingElse
Der erste Lauf sieht gut aus, wurde aber nicht gründlich getestet. Verwenden Sie es, wenn Sie für Ihre App-Entwicklung möchten.
yargs
; Alle Parameter nach dem--
können in Ihrem Skript perfekt analysiert werden.