Catatan: Pendekatan ini mengubah Anda package.json
dengan cepat, gunakan jika Anda tidak memiliki alternatif.
Saya harus meneruskan argumen baris perintah ke skrip saya yang kira-kira seperti:
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
Jadi, ini berarti saya memulai aplikasi saya dengan npm run start
.
Sekarang jika saya ingin memberikan beberapa argumen, saya akan mulai dengan mungkin:
npm run start -- --config=someConfig
Apa yang dilakukan adalah: npm run build && npm run watch -- --config=someConfig
. Masalah dengan ini adalah, selalu menambahkan argumen di akhir skrip. Ini berarti semua skrip dirantai tidak mendapatkan argumen ini (Args mungkin atau mungkin tidak diperlukan oleh semua, tapi itu cerita yang berbeda.). Lebih jauh ketika skrip yang terhubung dipanggil maka skrip tersebut tidak akan mendapatkan argumen yang diteruskan. yaitu watch
skrip tidak akan mendapatkan argumen yang lulus.
Penggunaan produksi aplikasi saya adalah sebagai .exe
, jadi melewati argumen di exe berfungsi dengan baik tetapi jika ingin melakukan ini selama pengembangan, itu akan bermasalah.
Saya tidak dapat menemukan cara yang tepat untuk mencapai ini, jadi inilah yang saya coba.
Saya telah membuat file javascript: start-script.js
pada tingkat induk aplikasi, saya memiliki "default.package.json" dan alih-alih mempertahankan "package.json", saya memelihara "default.package.json". Tujuannya start-script.json
adalah membaca default.package.json
, mengekstrak, scripts
dan mencari npm run scriptname
lalu menambahkan argumen yang lolos ke skrip ini. Setelah ini, itu akan membuat yang baru package.json
dan menyalin data dari default.package.json dengan skrip yang dimodifikasi dan kemudian memanggil 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);
}
Sekarang, alih-alih melakukan npm run start
, saya lakukannode start-script.js --c=somethis --r=somethingElse
Proses awal terlihat baik-baik saja, tetapi belum diuji secara menyeluruh. Gunakan itu, jika Anda suka untuk pengembangan aplikasi Anda.
yargs
; semua parameter setelah--
dapat diuraikan dengan sempurna di skrip Anda.