Uwaga: To podejście modyfikuje Twoje package.json
w locie, użyj go, jeśli nie masz alternatywy.
Musiałem przekazać argumenty wiersza poleceń do moich skryptów, które były jak:
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
Oznacza to, że uruchamiam aplikację npm run start
.
Jeśli chcę przekazać jakieś argumenty, zacznę od:
npm run start -- --config=someConfig
Co to robi to: npm run build && npm run watch -- --config=someConfig
. Problem w tym, że zawsze dołącza argumenty na końcu skryptu. Oznacza to, że wszystkie powiązane łańcuchy skryptów nie otrzymują tych argumentów (Argumenty mogą, ale nie muszą być wymagane przez wszystkich, ale to inna historia). Ponadto po wywołaniu połączonych skryptów te skrypty nie otrzymają przekazanych argumentów. tj. watch
Skrypt nie otrzyma przekazanych argumentów.
Wykorzystanie produkcyjne mojej aplikacji jest takie .exe
, więc przekazywanie argumentów w exe działa dobrze, ale jeśli chcesz to zrobić podczas programowania, staje się problamatyczne.
Nie mogłem znaleźć odpowiedniego sposobu, aby to osiągnąć, więc właśnie tego próbowałem.
Utworzyłem plik javascript: start-script.js
na poziomie nadrzędnym aplikacji mam „default.package.json” i zamiast utrzymywać „package.json”, utrzymuję „default.package.json”. Celem start-script.json
jest odczytanie default.package.json
, wyodrębnienie scripts
i poszukiwanie, npm run scriptname
a następnie dołączenie przekazanych argumentów do tych skryptów. Następnie utworzy nowy package.json
i skopiuje dane z pliku default.package.json ze zmodyfikowanymi skryptami, a następnie wywoła 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);
}
Teraz, zamiast robić npm run start
, robięnode start-script.js --c=somethis --r=somethingElse
Początkowy przebieg wygląda dobrze, ale nie został dokładnie przetestowany. Skorzystaj z niego, jeśli chcesz tworzyć aplikacje.
yargs
; wszystkie parametry po--
znaku można idealnie przeanalizować w skrypcie.