Lưu ý: Cách tiếp cận này sửa đổi nhanh chóng của bạn package.json
, sử dụng nó nếu bạn không có cách nào khác.
Tôi đã phải chuyển các đối số dòng lệnh cho các tập lệnh của mình giống như:
"scripts": {
"start": "npm run build && npm run watch",
"watch": "concurrently \"npm run watch-ts\" \"npm run watch-node\"",
...
}
Vì vậy, điều này có nghĩa là tôi bắt đầu ứng dụng của mình với npm run start
.
Bây giờ nếu tôi muốn vượt qua một số đối số, tôi sẽ bắt đầu với có thể:
npm run start -- --config=someConfig
Điều này làm là : npm run build && npm run watch -- --config=someConfig
. Vấn đề với điều này là, nó luôn nối các đối số vào cuối tập lệnh. Điều này có nghĩa là tất cả các tập lệnh được xâu chuỗi không có được các đối số này (Các đối số có thể hoặc không thể được yêu cầu bởi tất cả, nhưng đó là một câu chuyện khác.). Hơn nữa khi các tập lệnh được liên kết được gọi thì các tập lệnh đó sẽ không nhận được các đối số được thông qua. tức là watch
kịch bản sẽ không nhận được các đối số được thông qua.
Việc sử dụng sản xuất ứng dụng của tôi là như một .exe
, vì vậy việc chuyển các đối số trong exe hoạt động tốt nhưng nếu muốn thực hiện điều này trong quá trình phát triển, điều đó thật đáng kinh ngạc.
Tôi không thể tìm thấy bất kỳ cách thích hợp để đạt được điều này, vì vậy đây là những gì tôi đã cố gắng.
Tôi đã tạo một tệp javascript: start-script.js
ở cấp độ cha mẹ của ứng dụng, tôi có "default.package.json" và thay vì duy trì "pack.json", tôi duy trì "default.package.json". Mục đích của start-script.json
là để đọc default.package.json
, trích xuất scripts
và tìm kiếm npm run scriptname
sau đó nối các đối số đã truyền vào các tập lệnh này. Sau này, nó sẽ tạo một package.json
dữ liệu mới và sao chép dữ liệu từ default.package.json với các tập lệnh được sửa đổi và sau đó gọi 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);
}
Bây giờ, thay vì làm npm run start
, tôi làmnode start-script.js --c=somethis --r=somethingElse
Việc chạy ban đầu có vẻ tốt, nhưng chưa được kiểm tra kỹ lưỡng. Sử dụng nó, nếu bạn muốn cho bạn phát triển ứng dụng.
yargs
; tất cả các tham số sau--
có thể được phân tích cú pháp hoàn hảo trong tập lệnh của bạn.