Not: Bu yaklaşım,package.json
anında alternatifiniz yoksa kullanın.
Komut satırı argümanları gibi komutlarıma geçmek zorunda kaldım:
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
Yani, bu benim app ile başlatmak anlamına gelir npm run start
.
Şimdi bazı argümanlar geçmek istiyorsanız, belki ile başlar:
npm run start -- --config=someConfig
Ne yapar geçerli: npm run build && npm run watch -- --config=someConfig
. Buradaki problem, her zaman argümanları kodun sonuna ekler. Bu, tüm zincirlenmiş komut dosyalarının bu argümanları almadığı anlamına gelir (Args herkes tarafından istenebilir veya istenmeyebilir, ancak bu farklı bir hikaye.). Ayrıca, bağlantılı komut dosyaları çağrıldığında, bu komut dosyaları iletilen bağımsız değişkenleri alamaz. Yani watch
komut dosyası iletilen argümanları alamaz.
Uygulamamın üretim kullanımı .exe
, bu yüzden exe'deki argümanları geçmek iyi çalışır, ancak geliştirme sırasında bunu yapmak istiyorsanız, prolamatik olur.
Bunu başarmak için uygun bir yol bulamadım, bu yüzden denedim.
Bir javascript dosyası oluşturduk: start-script.js
uygulamanın üst düzeyinde, bir "default.package.json" var ve "package.json" korumak yerine, "default.package.json" korumak. Amacı, bu komut dosyalarına iletilen bağımsız değişkenleri start-script.json
okumak default.package.json
, ayıklamak scripts
ve npm run scriptname
aramaktır. Bundan sonra, yeni bir oluşturur package.json
ve değiştirilmiş komut dosyalarıyla varsayılan.package.json'dan verileri kopyalar ve çağırır 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);
}
Şimdi, yerine yapmanın npm run start
, yapmamnode start-script.js --c=somethis --r=somethingElse
İlk koşu iyi görünüyor, ancak tam olarak test edilmedi. Uygulama geliştirme için isterseniz kullanın.
yargs
; sonra tüm parametreler--
betiğinizde mükemmel bir şekilde ayrıştırılabilir.