नोट: यह दृष्टिकोण आपके package.json
मक्खी पर संशोधन करता है , यदि आपके पास कोई विकल्प नहीं है तो इसका उपयोग करें।
मुझे अपनी स्क्रिप्ट में कमांड लाइन आर्ग्युमेंट पास करने थे जो कुछ इस तरह थे:
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
तो, इसका मतलब है कि मैं अपना ऐप शुरू करता हूं npm run start
।
अब अगर मैं कुछ दलीलें पास करना चाहता हूं, तो शायद मैं शुरू करूंगा:
npm run start -- --config=someConfig
क्या करता है: npm run build && npm run watch -- --config=someConfig
। इसके साथ समस्या यह है, यह हमेशा तर्कों को स्क्रिप्ट के अंत में जोड़ता है। इसका मतलब यह है कि सभी जंजीरों वाली लिपियों को ये तर्क नहीं मिलते (Args की आवश्यकता हो सकती है या नहीं भी हो सकती है, लेकिन यह एक अलग कहानी है।) इसके अलावा जब लिंक की गई स्क्रिप्ट्स को कॉल किया जाता है तो उन स्क्रिप्ट्स को पास किए गए तर्क नहीं मिलेंगे। यानीwatch
स्क्रिप्ट को पास की गई दलीलें नहीं मिलेंगी।
मेरे ऐप का उत्पादन उपयोग एक के रूप में है .exe
, इसलिए एक्स में तर्कों को पारित करना ठीक काम करता है लेकिन अगर विकास के दौरान ऐसा करना चाहते हैं, तो यह संभव है।
मुझे इसे प्राप्त करने का कोई उचित तरीका नहीं मिला, इसलिए मैंने यही कोशिश की है।
मैंने एक जावास्क्रिप्ट फ़ाइल बनाई है: start-script.js
आवेदन के मूल स्तर पर, मेरे पास "default.package.json" है और "package.json" को बनाए रखने के बजाय, मैं "default.package.json" बनाए रखता हूं। इसका उद्देश्य इन लिपियों start-script.json
को पढ़े गए तर्क को पढ़ना default.package.json
, निकालना scripts
और देखना है npm run scriptname
। इसके बाद, यह एक नया बना देगा package.json
और default.package.json से डेटा को संशोधित स्क्रिप्ट के साथ कॉपी करेगा और फिर कॉल करेगा 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);
}
अब, करने के बजाय npm run start
, मैं करता हूंnode start-script.js --c=somethis --r=somethingElse
प्रारंभिक रन ठीक लग रहा है, लेकिन अच्छी तरह से परीक्षण नहीं किया है। अगर आपको ऐप डेवलप करना पसंद है तो इसका इस्तेमाल करें।
yargs
;--
आपके स्क्रिप्ट में पूरी तरह से पार्स होने के बाद सभी पैरामीटर ।