Npm स्क्रिप्ट के लिए कमांड लाइन तर्क भेजना


816

scriptsमेरे package.jsonवर्तमान का भाग इस तरह दिखता है:

"scripts": {
    "start": "node ./script.js server"
}

... जिसका मतलब है कि मैं npm startसर्वर शुरू करने के लिए चला सकता हूं । अब तक सब ठीक है।

हालाँकि, मैं ऐसा कुछ करने में सक्षम होना चाहूंगा npm start 8080और तर्क (ओं) को पारित किया जा सकता है script.js(जैसे npm start 8080=> node ./script.js server 8080)। क्या यह संभव है?

जवाबों:


1128

संपादित करें 2014.10.30: यह npm runnpm 2.0.0 तक args पास करना संभव है

सिंटैक्स निम्नानुसार है:

npm run <command> [-- <args>]

आवश्यक नोट करें --। जरूरत है कि npmखुद को कमांड करने के लिए पास किए गए पैरामेट्स को अलग किया जाए और आपकी स्क्रिप्ट को पास किए गए पैरामेट्स।

तो अगर आप में है package.json

"scripts": {
    "grunt": "grunt",
    "server": "node server.js"
}

तब निम्न आदेश समतुल्य होंगे:

grunt task:target => npm run grunt -- task:target

node server.js --port=1337 => npm run server -- --port=1337

पैरामीटर मान प्राप्त करने के लिए, यह प्रश्न देखें । नामित मापदंडों को पढ़ने के लिए, यार्ग्स या मिनिमिस्ट जैसे पार्सिंग लाइब्रेरी का उपयोग करना सबसे अच्छा है ; नोड्ज process.argvवैश्विक रूप से उजागर होता है , जिसमें कमांड लाइन पैरामीटर मान होते हैं, लेकिन यह एक निम्न-स्तरीय एपीआई (व्हाट्सएप-अलग-थलग सरणी के तार, जैसा कि ऑपरेटिंग सिस्टम द्वारा नोड निष्पादन योग्य को प्रदान किया जाता है)।


2013.10.03 संपादित करें: यह वर्तमान में सीधे संभव नहीं है। लेकिन आपके द्वारा पूछे जा रहे व्यवहार को लागू करने के लिए संबंधित GitHub मुद्दा खोला गयाnpm है। ऐसा लगता है कि सर्वसम्मति से इसे लागू किया जाना है, लेकिन यह पहले हल किए जा रहे एक अन्य मुद्दे पर निर्भर करता है।


मूल उत्तर: कुछ प्रकार के वर्कअराउंड के रूप में (हालांकि बहुत काम नहीं), आप निम्नानुसार कर सकते हैं:

कहते हैं कि आपके पैकेज का नाम package.jsonहै myPackageऔर आपके पास भी है

"scripts": {
    "start": "node ./script.js server"
}

फिर इसमें जोड़ें package.json:

"config": {
    "myPort": "8080"
}

और अपने में script.js:

// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080

इस तरह, डिफ़ॉल्ट रूप npm startसे 8080 का उपयोग करेगा। आप हालांकि इसे कॉन्फ़िगर कर सकते हैं (मूल्य npmइसके आंतरिक भंडारण द्वारा संग्रहीत किया जाएगा ):

npm config set myPackage:myPort 9090

फिर, जब आह्वान npm startकिया जाता है, तो 9090 का उपयोग किया जाएगा (डिफ़ॉल्ट package.jsonओवरराइड हो जाता है)।


1
यह भी जैसे पैकेज के साथ पूरी तरह से काम करता है yargs; --आपके स्क्रिप्ट में पूरी तरह से पार्स होने के बाद सभी पैरामीटर ।
थॉमस

11
AFAIKS, यह केवल आपकी स्क्रिप्ट के अंत में पैरामीटर जोड़ना संभव बनाता है .. अगर आपको बीच में पैरामीटर की आवश्यकता हो तो क्या होगा?
Spock'

108
-- --argsपवित्र बकवास जो अजीब है, लेकिन ठीक है
अगस्त

9
@Spock आप शेल फ़ंक्शन का उपयोग कर सकते हैं। यहाँ एक एस्लिंट + tslint सेटअप है, जिसका उपयोग मैं "npm रन लिंट - -फ यूनिक्स": "lint": "f () {eslint -f कोडफ्रेम $ @। && npm रन के माध्यम से, एग्लेन्स के लिए कस्टम आर्ग्स पास करने की अनुमति देने के लिए करता हूं। tslint && गूंज 'एक प्रकार का वृक्ष साफ!';}; एफ "
इमानौट

3
"MyPackage: myPort 9090" मान सेट करने के लिए अच्छे तरीके से कमांड के लिए एक कॉन्फिगरेशन फ्लैग के साथ है --myPackage: myPort = 9090 "- keithcirkel.co.uk/how-to-npm-as-a-abuild -तुल
क्रिस्मार्क्स

221

आपने कुछ चलाने में सक्षम होने के लिए कहा की तरह npm start 8080script.jsनिम्नानुसार फ़ाइलों को संशोधित या कॉन्फ़िगर करने की आवश्यकता के बिना यह संभव है।

उदाहरण के लिए, अपने में "scripts" JSON मूल्य में, शामिल हैं -

"start": "node ./script.js server $PORT"

और फिर कमांड-लाइन से:

$ PORT=8080 npm start

मैंने पुष्टि की है कि यह bash और npm 1.4.23 का उपयोग करके काम करता है। ध्यान दें कि इस कार्य के लिए GitHub npm समस्या को हल करने के लिए # 3494 की आवश्यकता नहीं है ।


19
यह वास्तव में अच्छी तरह से काम करता है। आप node ./script.js server ${PORT:-8080}इसे वैकल्पिक बनाने के लिए भी कुछ कर सकते हैं ।
अंगूर

7
मुझे लगता है कि यह git bash के साथ विंडोज़ में करने में असमर्थ है। किसी को भी यह शायद काम कर रहा है? (वही कमांड ubuntu पर काम करता है)
करोलिस Šarapnickis

3
अरे @ इग्रुप ने मेरे लिए यह काम किया NODE_PORT=${PORT=8080}(बराबर बराबर नहीं): - वाक्यविन्यास
MaieonBrix 10

14
यह क्रॉस-प्लेटफ़ॉर्म काम नहीं करता है! उदाहरण के लिए विंडोज पर कमांड की आवश्यकता होगी node ./script.js server %PORT%क्रॉस-वर्जन और क्रॉस-एनवी का उपयोग करने पर विचार करें ।
स्टिजन डे विट

Env var का उपयोग करने के लिए usecase क्योंकि cli args मुझे बहुत सीमित लगता है? हो सकता है कि सामान्य रूप से env vars, चूक, और कॉन्फ़िगरेशन को संभालने के लिए config मॉड्यूल जैसे कुछ का उपयोग करें।
Mr5o1

93

आप यह भी कर सकते हैं:

इन package.json:

"scripts": {
    "cool": "./cool.js"
}

इन cool.js:

 console.log({ myVar: process.env.npm_config_myVar });

सीएलआई में:

npm --myVar=something run-script cool

उत्पादन करना चाहिए:

{ myVar: 'something' }

अपडेट: npm 3.10.3 का उपयोग करना, ऐसा प्रतीत होता है कि यह process.env.npm_config_चर को कम करता है? मैं भी उपयोग कर रहा हूँ better-npm-run, इसलिए मैं नहीं यकीन है कि अगर यह वेनिला डिफ़ॉल्ट व्यवहार है या नहीं हूँ, लेकिन इस सवाल का जवाब है काम कर रहे। इसके बजाय process.env.npm_config_myVar, प्रयास करेंprocess.env.npm_config_myvar


4
धन्यवाद यह मेरे लिए काम किया! क्या मैं विशेष रूप से "npm_config_" के लिए अनुपलब्ध था चर नाम जो कि आप कमांड लाइन पर निर्दिष्ट कर रहे हैं।
jp093121 18

2
ये गलत है। process.env.npm_config_myVarसच लौटाता है, मूल्य नहीं।
कार्ल मॉरिसन

1
एनपीएम संस्करण 6.8.0 के साथ काम करता है, लेकिन केवल जब मैंने चर नाम के लिए लोअरकेस का उपयोग किया था। यह लग रहा है कि nLL npm इसे लोअरकेस में बदल देता है
Ofir मेगुरी

महान समाधान, npm 6.5.0 पर कम केस परम के साथ काम करता है
गैविनबेल्सन

77

jakub.g का उत्तर सही है, हालांकि का उपयोग करने वाला एक उदाहरण थोड़ा जटिल लगता है।

तो मेरा सरल उत्तर:

- npm स्क्रिप्ट के लिए कमांड लाइन तर्क भेजना

एक npm स्क्रिप्ट के लिए कमांड लाइन तर्क भेजने के लिए सिंटैक्स:

npm run [command] [-- <args>]

कल्पना कीजिए कि हमारे पैकेज में एक npm स्टार्ट कार्य है। वेबपैक देव सर्वर को बंद करने के लिए।

"scripts": {
  "start": "webpack-dev-server --port 5000"
},

हम इसे कमांड लाइन से चलाते हैं npm start

अब अगर हम npm स्क्रिप्ट के लिए एक पोर्ट में जाना चाहते हैं:

"scripts": {
  "start": "webpack-dev-server --port process.env.port || 8080"
},

इसे चलाना और पोर्ट को पास करना जैसे 5000 कमांड लाइन के माध्यम से निम्नानुसार होगा:

npm start --port:5000

- package.json config का उपयोग करना:

जैसा कि jakub.g द्वारा बताया गया है , आप वैकल्पिक रूप से अपने पैकेज के विन्यास में params सेट कर सकते हैं। json

"config": {
  "myPort": "5000"
}

"scripts": {
  "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},

npm start आपके कॉन्फ़िगरेशन में निर्दिष्ट पोर्ट का उपयोग करेगा, या वैकल्पिक रूप से आप इसे ओवरराइड कर सकते हैं

npm config set myPackage:myPort 3000

- अपने npm स्क्रिप्ट में एक परम की स्थापना

आपकी npm स्क्रिप्ट में एक चर सेट पढ़ने का एक उदाहरण। इस उदाहरण मेंNODE_ENV

"scripts": {
  "start:prod": "NODE_ENV=prod node server.js",
  "start:dev": "NODE_ENV=dev node server.js"
},

NODE_ENV को server.js में या तो ठेस या देव के रूप में पढ़ें

var env = process.env.NODE_ENV || 'prod'

if(env === 'dev'){
    var app = require("./serverDev.js");
} else {
    var app = require("./serverProd.js");
}

5
ध्यान दें कि वाक्य रचना की तरह "start:prod": "NODE_ENV=prod node server.js"में package.jsonविंडोज पर काम नहीं करेगा, जब तक आप का उपयोग पार env
jakub.g

2
सुधार ?: इस ट्यूटोरियल द्वारा बताए गए मेरे उपयोग के अनुसार "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },होना चाहिए । जाहिरा तौर पर जावास्क्रिप्ट के भीतर प्रक्रिया रेफ का उपयोग किया जा सकता है। "start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
आरोन रोलर


34

process.argvअपने कोड में उपयोग करें तो बस एक अनुगामी प्रदान करें$* अपनी स्क्रिप्ट मान प्रविष्टि में करें।

एक उदाहरण के रूप में इसे एक सरल लिपि के साथ आज़माएं, जो प्रदान किए गए तर्कों को मानक रूप से पूरा करता है echoargs.js:

console.log('arguments: ' + process.argv.slice(2));

package.json:

"scripts": {
    "start": "node echoargs.js $*"
}

उदाहरण:

> npm start 1 2 3
arguments: 1,2,3

process.argv[0] निष्पादन योग्य (नोड) है, process.argv[1] आपकी स्क्रिप्ट है।

Npm v5.3.0 और नोड v8.4.0 के साथ परीक्षण किया गया


--तर्कों में जोड़ने के बाद काम नहीं करता है, जैसे - npm run demo.js --skip, यह काम करता है अगर एक अतिरिक्त जोड़ा जाता है --, जैसे -npm run demo.js -- --skip
श्रेयस

क्या आप एक अलग echoargs.jsस्क्रिप्ट फ़ाइल के बिना इस पद्धति का उपयोग कर सकते हैं ?
जोशुआ पिंटर

@JoshuaPinter echoargs.js सिर्फ उदाहरण के रूप में है, मैं यह स्पष्ट करने के लिए अपने उत्तर को संपादित करूँगा
पीटर

@Peter राइट, लेकिन क्या यह एक स्क्रिप्ट फ़ाइल होना चाहिए। मैं एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं जो एंड्रॉइड एमुलेटर पर adbएक .dbफ़ाइल को पुश करने के लिए उपयोग करता है और फ़ाइल के स्थानीय पथ के लिए एक परम को स्वीकार करता है .dbताकि इसे धक्का दे सके, जो कि पहला पैरामीटर है adb push। कुछ इस तरह: "db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"और मैं इसके साथ कॉल करना चाहता हूं npm run db:push /Users/joshuapinter/Downloads/updated.db। कोई विचार?
जोशुआ पिंटर

21

यदि आप npm स्क्रिप्ट के बीच में तर्क पारित करना चाहते हैं, जैसा कि उन्हें अंत में संलग्न करने का विरोध किया जाता है, तो इनलाइन पर्यावरण चर अच्छी तरह से काम करने लगते हैं:

"scripts": {
  "dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
  "start": "npm run build && node lib/server/index.js",
  "build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},

यहाँ, वॉच फ़्लैग को कोलाहल से npm run devगुज़रता है -w, लेकिन npm run startबस एक बार एक नियमित निर्माण चलाता है।


इसे CLI से कैसे कहा जाता है?
bobobst

@ ड्रेड्सिन npm run dev,npm start
टीजे

2
विंडोज पर इसका उपयोग करने के लिए क्रॉस-एनवी का उपयोग करने की आवश्यकता है ।
१६:१६

7

मैं अतीत में इस वन-लाइनर का उपयोग कर रहा था, और थोड़े समय के बाद Node.js से दूर रहने की कोशिश की थी और इसे हाल ही में फिर से खोजा। @Francoisrv द्वारा उल्लिखित समाधान के समान, यह node_config_*चर का उपयोग करता है।

निम्नलिखित न्यूनतम package.jsonफ़ाइल बनाएँ :

{
  "name": "argument",
  "version": "1.0.0",
  "scripts": {
    "argument": "echo \"The value of --foo is '${npm_config_foo}'\""
  }
}

निम्न आदेश चलाएँ:

npm run argument --foo=bar

निम्नलिखित आउटपुट का निरीक्षण करें:

--Foo का मान 'बार' है

यह सब npm आधिकारिक दस्तावेज में अच्छी तरह से प्रलेखित है:

नोट: पर्यावरण चर शीर्षक बताते हैं कि स्क्रिप्ट के अंदर चर क्या दस्तावेज में परिभाषित किया गया है करने के लिए अलग तरह से व्यवहार करते हैं। यह सच है जब यह केस सेंसिटिविटी के साथ आता है , साथ ही यह तर्क कि स्पेस के साथ परिभाषित किया गया है या साइन के बराबर है

नोट: यदि आप हाइफ़न के साथ एक तर्क का उपयोग कर रहे हैं, तो इन्हें संबंधित परिवेश चर में अंडरस्कोर के साथ बदल दिया जाएगा। उदाहरण के लिए, के npm run example --foo-bar=bazअनुरूप होगा${npm_config_foo_bar}

नोट: गैर-डब्ल्यूएसएल विंडोज उपयोगकर्ताओं के लिए, @ डॉक्टर ब्लू की टिप्पणियों को नीचे देखें ... टीएल; डीआर के ${npm_config_foo}साथ प्रतिस्थापित करें %npm_config_foo%


हैलो। मैं आपके उदाहरण का उपयोग करने का प्रयास कर रहा हूं लेकिन मुझे डर है कि यह मेरे लिए काम नहीं कर रहा है। मैंने आपके "तर्क" स्क्रिप्ट को कॉपी-पेस्ट किया, और कमांड को चलाने के लिए वही किया ( npm run argument --foo=bar), लेकिन चर को प्रतिस्थापित नहीं किया गया है "The value of --foo is '${npm_config_foo}'":। विंडोज 10 पर चल रहा है अगर वह मायने रखता है, एनपीएम के संस्करण 6.9.0 के साथ।
डॉक्टर ब्लू

@DoctorBlue आह ठीक है, नोड और विंडोज हमेशा अच्छा नहीं खेलते हैं ... यह लेख एनपीएम लिपियों में पर्यावरण चर पर कुछ प्रकाश डाल सकता है: (टीएल; डीआर आदेश सीधे मेजबान ओएस पर जाते हैं, भले ही दूसरे शेल से लॉन्च किया गया हो) ब्लॉग .risingstack.com / नोड- js-windows-10-tutorial /… मुझे आपके सेटअप पर यकीन नहीं है, लेकिन यदि आप नोड चलाने के लिए गिट बैश का उपयोग कर रहे हैं, तो आप इसे WSL :) डॉक्स के
एंड्रयू ओड्री

1
मैं यह समझ गया। बस %npm_config_foo%इसके बजाय उपयोग करना था। शुद्ध विंडोज कमांड लाइन / शक्तियाँ यहाँ। (या तो एक विकल्प नहीं है।)
डॉक्टर ब्लू

6

यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है लेकिन आप इसके बजाय हमेशा पर्यावरण चर का उपयोग कर सकते हैं:

"scripts": {
    "start": "PORT=3000 node server.js"
}

फिर अपने server.js फ़ाइल में:

var port = process.env.PORT || 3000;

1
यह तब तक अच्छा है जब तक आप यूनिक्स प्लेटफॉर्म पर हैं। दुर्भाग्य से यह विंडोज के साथ काम नहीं करता है क्योंकि इसका अपना एक सम्मेलन है।
जुहो वेप्सलाएन 19

6

ऊपर दिए गए अधिकांश उत्तर आपके NodeJS स्क्रिप्ट में तर्कों को पास करने के लिए कवर करते हैं, जिन्हें npm कहते हैं। मेरा समाधान सामान्य उपयोग के लिए है।

बस npm स्क्रिप्ट को शेल दुभाषिया (जैसे sh) कॉल के साथ लपेटें और तर्कों को हमेशा की तरह पास करें। एकमात्र अपवाद यह है कि पहला तर्क संख्या है0

उदाहरण के लिए, आप npm लिपि को जोड़ना चाहते हैं someprogram --env=<argument_1>, जहाँ someprogramकेवल का मान छापता हैenv तर्क है:

package.json

"scripts": {
  "command": "sh -c 'someprogram --env=$0'"
}

जब आप इसे चलाते हैं:

% npm run -s command my-environment
my-environment

धन्यवाद! यह सही था!
फेलिप डेसिडेराटी

सरल और सुरुचिपूर्ण! एक MS डॉस शेल पर काम नहीं करेगा।
n370

3

जब मैं देखता हूं, लोग पैकेज.जॉन स्क्रिप्ट का उपयोग करते हैं, जब वे स्क्रिप्ट को सरल तरीके से चलाना चाहते हैं। उदाहरण के लिए, nodemonस्थानीय नोड_मॉडल में स्थापित करने के लिए , हम nodemonसीधे cli से कॉल नहीं कर सकते हैं , लेकिन हम इसे कॉल करके उपयोग कर सकते हैं ./node_modules/nodemon/nodemon.js। तो, इस लंबी टाइपिंग को आसान बनाने के लिए, हम इसे लगा सकते हैं ...

    ...

    स्क्रिप्ट: {
      'start': 'nodemon app.js'
    }

    ...

... तो npm start'nodemon' का उपयोग करने के लिए कॉल करें जिसमें पहला तर्क के रूप में app.js है।

मैं जो कहना चाह रहा हूं, अगर आप सिर्फ अपना सर्वर nodeकमांड के साथ शुरू करना चाहते हैं, तो मुझे नहीं लगता कि आपको उपयोग करने की आवश्यकता है scripts। टाइपिंग npm startया node app.jsएक ही प्रयास है।

लेकिन अगर आप उपयोग करना चाहते हैं nodemon, और एक डायनामिक तर्क पारित करना चाहते हैं, तो उपयोग न करें script। इसके बजाय सिमलिंक का उपयोग करने का प्रयास करें।

उदाहरण के लिए माइग्रेशन का उपयोग करके sequelize। मैं एक सिमलिंक बनाता हूं ...

ln -s node_modules/sequelize/bin/sequelize sequelize

... और मैं किसी भी तर्क को पारित कर सकता हूं जब मैं इसे कॉल करता हूं ...

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

./sequelize -m -u /* downgrade migration */

आदि...

इस बिंदु पर, सिम्कलिन का उपयोग करना सबसे अच्छा तरीका है जिसे मैं समझ सकता हूं, लेकिन मुझे नहीं लगता कि यह सबसे अच्छा अभ्यास है।

मुझे अपने जवाब के लिए आपकी राय की भी उम्मीद है।


1
इस सवाल का जवाब बिल्कुल नहीं है। मुझे नहीं पता कि इसे 6
अपवोट

2

नोट: यह दृष्टिकोण आपके 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

प्रारंभिक रन ठीक लग रहा है, लेकिन अच्छी तरह से परीक्षण नहीं किया है। अगर आपको ऐप डेवलप करना पसंद है तो इसका इस्तेमाल करें।


1

मुझे यह सवाल मिला है जब मैं सीक्वेल सीड चलाने के साथ अपने मुद्दे को हल करने की कोशिश कर रहा था: सीएलआई कमांड उत्पन्न करें:

node_modules/.bin/sequelize seed:generate --name=user

मुझे बात करने दो। मैं अपने पैकेज में एक छोटी स्क्रिप्ट कमांड रखना चाहता था फ़ाइल को एक ही समय में --name तर्क और प्रदान करना

जवाब कुछ प्रयोगों के बाद आया। यहाँ package.json में मेरी कमांड है

"scripts: {
  "seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}

... और यहां उपयोगकर्ता के लिए एक बीज फ़ाइल बनाने के लिए इसे टर्मिनल में चलाने का एक उदाहरण है

> yarn seed:generate --name=user

> npm run seed:generate -- --name=user

FYI करें

yarn -v
1.6.0

npm -v
5.6.0

2
क्या यह वही तकनीक है जिसे 2013 में स्वीकार किए गए उत्तर में समझाया गया था, पास करने के लिए -- --arg1, ...?
डेन डैस्केल्स्कु

2
ठीक है, फिर उत्तर क्यों दोहराएं?
डैन डस्केल्सस्कु

मैंने उपयोग का एक अलग उदाहरण साझा किया है, क्या यह स्पष्ट नहीं है?
सर्ज सीलेटस्की

2
अगर मैं एक अलग उत्तर में बताई गई तकनीक के लिए एक और उदाहरण साझा करना चाहता था, तो मैं उस उत्तर के लिए एक टिप्पणी के रूप में अपना उदाहरण जोड़ूंगा।
Dan Dascalescu


0

npm run script_target - <तर्क> मूल रूप से यह कमांड लाइन के तर्कों को पारित करने का तरीका है, लेकिन यह केवल तभी काम करेगा जब स्क्रिप्ट में केवल एक कमांड चल रही हो जैसे कि मैं एक कमांड चला रहा हूं अर्थात npm रन प्रारंभ - 4200

"script":{
       "start" : "ng serve --port="
 }

यह कमांड लाइन मापदंडों को पारित करने के लिए चलेगा लेकिन क्या होगा यदि हम अधिक चलाते हैं तो एक कमांड जैसे npm रन बिल्ड c: / कार्यक्षेत्र / फ़ाइल

"script":{
       "build" : "copy c:/file <arg> && ng build"
 } 

लेकिन यह इस तरह की व्याख्या करेगा, जबकि प्रतिलिपि c: / file && ng बिल्ड c: / वर्क स्पेस / फ़ाइल चला रहा है और हम इस पर कुछ कर रहे हैं कॉपी c: / file c: / वर्क स्पेस / फाइल && ng बिल्ड के

नोट: - इसलिए कमांड लाइन पैरामीटर केवल स्क्रिप्ट में केवल एक कमांड के मामले में अपेक्षित विज्ञापन है।

मैंने ऊपर कुछ उत्तर पढ़े हैं, जिनमें से कुछ लिख रहे हैं कि आप $ प्रतीकों का उपयोग करके कमांड लाइन पैरामीटर तक पहुंच सकते हैं लेकिन यह काम नहीं करेगा


0

मुझे पता है कि पहले से ही एक स्वीकृत जवाब है, लेकिन मुझे यह JSON दृष्टिकोण पसंद है।

npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';

आमतौर पर मुझे 1 संस्करण पसंद है, जैसे कि परियोजना का नाम, इसलिए मुझे यह त्वरित n 'सरल लगता है।

इसके अलावा मैं अक्सर अपने पैकेज में कुछ इस तरह है

"scripts": {
    "start": "NODE_ENV=development node local.js"
}

और लालची होने के नाते मुझे "यह सब चाहिए", NODE_ENV और CMD लाइन arg सामान चाहिए।

आप बस इन चीजों को अपनी फ़ाइल में एक्सेस करते हैं (मेरे मामले में local.js)

console.log(process.env.NODE_ENV, starter_obj.CRAZY_ARR, starter_obj.PROJECT_NAME_STR, starter_obj.MAGICAL_NUMBER_INT, starter_obj.THING_BOO);

आपको बस इसके ऊपर यह होना चाहिए (मैं v10.16.0 btw चला रहा हूँ)

var starter_obj = JSON.parse(JSON.parse(process.env.npm_config_argv).remain[0]);

Anyoo, सवाल पहले से ही जवाब दिया। सोचा था कि मैं साझा करूंगा, क्योंकि मैं इस विधि का बहुत उपयोग करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.