এনপিএম স্ক্রিপ্টে কমান্ড লাইন আর্গুমেন্ট প্রেরণ করা হচ্ছে


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: এটি বর্তমানে এমন args পাস সম্ভব npm runnpm 2.0.0 হিসাবে

বাক্য গঠনটি নিম্নরূপ:

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 সম্পাদনা করুন: বর্তমানে এটি সরাসরি সম্ভব নয়। তবে আপনি যে আচরণটি জিজ্ঞাসা করছেন তা বাস্তবায়নের জন্য একটি সম্পর্কিত গিটহাব ইস্যু খোলেnpm । দেখে মনে হচ্ছে usক্যমত্য এটি কার্যকর হয়েছে, তবে এটি অন্য কোনও সমস্যার আগে সমাধান হওয়ার উপর নির্ভর করে।


আসল উত্তর: এক ধরণের কাজের মতো (যদিও খুব সহজ নয়), আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

আপনার প্যাকেজের নামটি 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 start8080 ব্যবহার করবে। আপনি তবে এটি কনফিগার করতে পারেন (মানটি npmএর অভ্যন্তরীণ স্টোরেজে সংরক্ষণ করা হবে ):

npm config set myPackage:myPort 9090

তারপরে, যখন অনুরোধ করা npm startহবে, 9090 ব্যবহার করা হবে (ডিফল্ট থেকে package.jsonওভাররাইড হয়ে যায়)।


1
এটি প্যাকেজগুলির মতো পুরোপুরি একসাথে কাজ করে yargs; এর পরে সমস্ত পরামিতিগুলি --আপনার স্ক্রিপ্টে পুরোপুরি পার্স করা যায়।
টমাস

11
আফাইকস, এটি কেবল আপনার স্ক্রিপ্টগুলির শেষে প্যারামিটার যুক্ত করা সম্ভব করে তোলে .. যদি আপনার মাঝখানে পরামিতিগুলির প্রয়োজন হয়?
স্পোক

108
-- --argsঅদ্ভুত তবে ঠিক আছে
ক্রপটি

9
@ স্পোক আপনি শেল ফাংশন ব্যবহার করতে পারেন। "এনপিএম রান লিন্ট - -ফ ইউনিক্স": "লিঙ্ক": "এফ () {এসলিন্ট -f কোডফ্রেমে via @ এর মাধ্যমে কাস্টম আরগগুলি এসলিন্টে পাস করার অনুমতি দেওয়ার জন্য আমি এখানে একটি এসলিন্ট + টিস্লিন্ট সেটআপ ব্যবহার করি & @ tslint & & echo 'lint clean!';}; f "
ecmanaut

3
"মাইপ্যাকেজ: মাইপোর্ট 9090" মানটি সেট করার সর্বোত্তম উপায় হ'ল "--myPackage: myPort = 9090" - কমান্ডটিতে একটি কনফিগার পতাকা রয়েছে - keithcirkel.co.uk/how-to-use-npm-as-a- বিল্ড -tool
chrismarx

221

আপনি কিছু চালাতে সক্ষম হবেন করতে বলা মত npm start 8080script.jsনিম্নরূপে ফাইলগুলি পরিবর্তন বা কনফিগার করার প্রয়োজন ছাড়াই এটি সম্ভব ।

উদাহরণস্বরূপ, আপনার "scripts"JSON মান, অন্তর্ভুক্ত--

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

এবং তারপরে কমান্ড-লাইন থেকে:

$ PORT=8080 npm start

আমি নিশ্চিত করেছি যে এটি ব্যাশ এবং এনপিএম 1.4.23 ব্যবহার করে কাজ করে। মনে রাখবেন যে এই কাজের চারপাশে গিটহাব এনপিএম ইস্যু # 3494 সমাধানের প্রয়োজন নেই ।


19
এটি সত্যিই ভাল কাজ করে। আপনি node ./script.js server ${PORT:-8080}এটিকে alচ্ছিক করে তোলার মতো কিছু করতেও পারেন ।
গ্রাপ

7
আমি গিট ব্যাশ সহ উইন্ডোতে এটি করতে অক্ষম বলে মনে হচ্ছে। কেউ কি এটা কাজ করতে পারে? (একই কমান্ড উবুন্টুতে কাজ করে)
করোলিস parapnickis

3
আরে @ NODE_PORT=${PORT=8080}গ্রেগ এটি আমার জন্য কাজ করেছে (সমানভাবে অবহিত) তবে এটি নয়: - সিনট্যাক্স
মায়িয়নব্রিক্স

14
এটি ক্রস প্ল্যাটফর্মের কাজ করে না! উদাহরণস্বরূপ উইন্ডোজে কমান্ডটি থাকা দরকার node ./script.js server %PORT%ক্রস-ভার এবং ক্রস-এনভির ব্যবহার বিবেচনা করুন ।
স্টিজন ডি উইট

ক্লাইভ আরোগুলি হিসাবে এনভি ভার্সার ব্যবহারের ব্যবহারটি আমার কাছে সীমাবদ্ধ মনে হচ্ছে? এছাড়াও এনভি ভার্স, ডিফল্ট এবং সাধারণভাবে কনফিগারেশন পরিচালনা করতে কনফিগার মডিউলের মতো কিছু ব্যবহার করতে পারে।
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' }

আপডেট: এনপিএম ৩.১০.৩ ব্যবহার করে দেখা যাচ্ছে যে এটি process.env.npm_config_ভেরিয়েবলকে ছোট করে ফেলেছে ? আমিও ব্যবহার করছি better-npm-run, সুতরাং আমি নিশ্চিত নই যে এটি ভ্যানিলা ডিফল্ট আচরণ কিনা বা না, তবে এই উত্তরটি কাজ করছে। পরিবর্তে process.env.npm_config_myVar, চেষ্টা করুনprocess.env.npm_config_myvar


4
ধন্যবাদ এটি আমার জন্য কাজ করেছে! আমি বিশেষভাবে "এনএমপি_কনফিগ_" অনুপস্থিতটি ভেরিয়েবল নামের যে উপস্থাপনটি কমান্ড লাইনে নির্দিষ্ট করে দিচ্ছি তা অনুপস্থিত।
jp093121

2
এটা ভুল. process.env.npm_config_myVarসত্য, না মান প্রত্যাবর্তন।
কার্ল মরিসন

1
এনপিএম সংস্করণ 8.৮.০ এর সাথে কাজ করে তবে আমি যখন পরিবর্তনশীল নামের জন্য ছোট হাতের ব্যবহার করি। এটা lilke npm পরিবর্তন তা ছোট হাতের অক্ষরে দেখায়
Ofir Meguri

দুর্দান্ত সমাধান, এনপিএম 6.5.0
গ্যাভিনবেলসনে

77

jakub.g এর উত্তর সঠিক, তবে গ্রান্ট ব্যবহার করে একটি উদাহরণ কিছুটা জটিল বলে মনে হচ্ছে।

সুতরাং আমার সহজ উত্তর:

- এনপিএম স্ক্রিপ্টে একটি কমান্ড লাইন আর্গুমেন্ট প্রেরণ

এনপিএম স্ক্রিপ্টে কমান্ড লাইন আর্গুমেন্ট প্রেরণের জন্য সিনট্যাক্স:

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

ভেবে দেখুন আমাদের ওয়েবপ্যাক ডেভ সার্ভারটি বন্ধ করতে আমাদের প্যাকেজ.জসনে একটি এনপিএম শুরুর কাজ রয়েছে:

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

আমরা কমান্ড লাইন দিয়ে এটি চালাই npm start

এখন আমরা যদি কোনও বন্দরে এনপিএম স্ক্রিপ্টে যেতে চাই:

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

এটি চালানো এবং বন্দর যেমন 5000 কমান্ড লাইনের মাধ্যমে পাস করা নিম্নলিখিত হবে:

npm start --port:5000

- package.json কনফিগারেশন ব্যবহার করে:

Jakub.g দ্বারা উল্লিখিত হিসাবে , আপনি বিকল্পভাবে আপনার প্যাকেজ.জসনের কনফিগারেশনে প্যারাম সেট করতে পারেন

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

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

npm start আপনার কনফিগারেশনে উল্লিখিত পোর্টটি ব্যবহার করবে বা বিকল্পভাবে আপনি এটি ওভাররাইড করতে পারেন

npm config set myPackage:myPort 3000

- আপনার এনপিএম স্ক্রিপ্টে একটি পরম সেট করা হচ্ছে

আপনার এনপিএম স্ক্রিপ্টে একটি পরিবর্তনশীল সেট পড়ার উদাহরণ। এই উদাহরণে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" },
অ্যারন রোলার

35

npm 2.x সমর্থন ক্লাইগ আরগ্স

হুকুম

npm run-script start -- --foo=3

Package.json

"start": "node ./index.js"

Index.js

console.log('process.argv', process.argv);


1
গৃহীত উত্তর (এটির চেয়ে এক বছর আগে দেওয়া) ইতিমধ্যে এই কৌশলটির উল্লেখ করেছে।
ড্যান ড্যাসকলেসকু

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]এটি আপনার স্ক্রিপ্ট।

এনপিএম ভি 5.3.0 এবং নোড ভি 8.4.0 এর সাথে পরীক্ষিত


--যুক্তি যুক্ত করার পরে কাজ করে না , যেমন - npm run demo.js --skipঅতিরিক্ত যুক্ত করা হলে এটি কাজ করে --, যেমন -npm run demo.js -- --skip
শ্রেয়াস

আপনি আলাদা echoargs.jsস্ক্রিপ্ট ফাইল না রেখে এই পদ্ধতিটি ব্যবহার করতে পারেন ?
জোশুয়া পিন্টার

@ জোশুয়াপিন্টার ইকোর্সস.জেএস ঠিক উদাহরণ হিসাবে বোঝানো হয়েছে, আমি এই উত্তরটি পরিষ্কার করতে আমার উত্তরটি সম্পাদনা করব
পিটার

@ পিটার রাইট, তবে এটি কি স্ক্রিপ্ট ফাইল হতে হবে? আমি এমন একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা অ্যান্ড্রয়েড এমুলেটরটিতে 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

যদি আপনি কোনও এনপিএম স্ক্রিপ্টের মাঝামাঝি যুক্তিগুলি পাস করতে চান তবে কেবল শেষের দিকে সংযুক্ত করা যায়, তবে ইনলাইন এনভায়রনমেন্ট ভেরিয়েবলগুলি সুন্দরভাবে কাজ করে বলে মনে হচ্ছে:

"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একবারে একবারে নিয়মিত বিল্ড চালায়।


এটি কীভাবে বলা হয় সিএলআই থেকে?
বুধবার

@ ড্রেসদিন npm run dev,npm start
টিজে

2
এটি উইন্ডোতে ব্যবহারের জন্য ক্রস-এনভিভ ব্যবহার করতে হবে।
fracz

7

আমি আগে এই ওয়ান-লাইনারটি ব্যবহার করে এসেছি এবং নোড.জেস থেকে কিছুটা দূরে থাকার পরে সম্প্রতি চেষ্টা করে আবার আবিষ্কার করতে হয়েছিল। @ ফ্র্যাঙ্কোইসারভ দ্বারা উল্লিখিত সমাধানের অনুরূপ, এটি 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 run example --foo-bar=bazঅনুরূপ হবে ${npm_config_foo_bar}

নোট: অ WSL উইন্ডোজ ব্যবহারকারীদের জন্য, নীচের ... টি এল @Doctor নীল মন্তব্য দেখতে; ডিআর প্রতিস্থাপন ${npm_config_foo}সঙ্গে %npm_config_foo%


হ্যালো. আমি আপনার উদাহরণটি ব্যবহার করার চেষ্টা করছি তবে আমি ভয় করি এটি আমার জন্য কাজ করছে না। আমি কপি-আটকানো আপনার "যুক্তি" স্ক্রিপ্ট, এবং চালানোর (কমান্ড জন্য একই করেনি npm run argument --foo=bar), কিন্তু পরিবর্তনশীল প্রতিস্থাপিত নয়: "The value of --foo is '${npm_config_foo}'"। এনপিএম এর Run.৯.০ সংস্করণ সহ, যদি তা গুরুত্বপূর্ণ হয় তবে উইন্ডোজ 10 এ চলছে।
ডক্টর ব্লু

@ ডক্টর ব্লু আহ, ঠিক আছে, নোড এবং উইন্ডোজ সবসময় দুর্দান্ত খেলেন না ... এই নিবন্ধটি এনপিএম স্ক্রিপ্টগুলিতে পরিবেশের পরিবর্তনগুলি সম্পর্কে কিছুটা আলোকপাত করতে পারে: (টিএল; ডিআর কমান্ডগুলি সরাসরি অন্য শেল থেকে চালু করা হলেও হোস্ট ওএসে সরাসরি যায়) ব্লগ .risingstack.com / নোড-জেএস-উইন্ডোজ-10-টিউটোরিয়াল /… আমি আপনার সেটআপের বিষয়ে নিশ্চিত নই তবে আপনি যদি নোড চালানোর জন্য গিট ব্যাশ ব্যবহার করছেন তবে আপনি ডাব্লুএসএল :) ডক্সের
en-us/windows/nodejs/setup-on-wsl2

1
আমি এটি বের করেছিলাম। কেবল %npm_config_foo%পরিবর্তে ব্যবহার করতে হবে। খাঁটি উইন্ডোজ কমান্ড লাইন / পাওয়ারশেল এখানে। (কোনও পছন্দ নেই।)
ডক্টর ব্লু

6

এটি সত্যই আপনার প্রশ্নের উত্তর দেয় না তবে আপনি তার পরিবর্তে সর্বদা পরিবেশের ভেরিয়েবল ব্যবহার করতে পারেন:

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

তারপরে আপনার সার্ভার.জেএস ফাইলটিতে:

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

1
আপনি ইউনিক্স প্ল্যাটফর্মে থাকাকালীন এটি ভাল। দুর্ভাগ্যক্রমে এটি উইন্ডোজের সাথে কাজ করে না কারণ এটির নিজস্ব একটি কনভেনশন রয়েছে।
জুহো ভেস্পসালিনেন

6

উপরের উত্তরগুলির বেশিরভাগগুলি কপিরাইট দ্বারা ডেকে আপনার নোডজেএস স্ক্রিপ্টে কেবল যুক্তিগুলি পাস করছে। আমার সমাধানটি সাধারণ ব্যবহারের জন্য।

শেল ইন্টারপ্রিটার (উদাহরণস্বরূপ sh) কল দিয়ে কেবল এনপিএম স্ক্রিপ্টটি মোড়ুন এবং যথারীতি আর্গুমেন্টগুলি পাস করুন। ব্যতিক্রম একমাত্র প্রথম যুক্তির সংখ্যা0

উদাহরণস্বরূপ, আপনি এনপিএম স্ক্রিপ্টটি যুক্ত করতে চান someprogram --env=<argument_1>যেখানে আর্গুমেন্টের someprogramমানটি কেবল মুদ্রণ করে env:

package.json

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

আপনি যখন এটি চালান:

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

ধন্যবাদ! এই নিখুঁত ছিল!
ফিলিপ দেশীদারতি

সরল ও মার্জিত! এমএস ডস শেলের উপর কাজ করবে না।
n370

3

আমি যা দেখছি সেগুলি থেকে লোকেরা প্যাকেজ.জসন স্ক্রিপ্টগুলি ব্যবহার করে যখন তারা সহজ উপায়ে স্ক্রিপ্টটি চালাতে চান। উদাহরণস্বরূপ, ব্যবহার করাnodemon স্থানীয় নোড_মডিউলগুলিতে ইনস্টল হওয়াটি করতে, আমরা nodemonসরাসরি ক্লাইপ থেকে কল করতে পারি না , তবে আমরা এটি ব্যবহার করে কল করতে পারি ./node_modules/nodemon/nodemon.js। সুতরাং, এই দীর্ঘ টাইপিংকে সহজ করার জন্য, আমরা এটি ...

    ...

    লিপি: {
      'start': 'nodemon app.js'
    }

    ...

... তারপরে npm start'নোডেমন' ব্যবহার করার জন্য কল করুন যা অ্যাপ্লিকেশন.জেসকে প্রথম যুক্তি হিসাবে দেখায়।

আমি যা বলতে চাইছি, আপনি যদি কেবল nodeকমান্ড দিয়ে আপনার সার্ভারটি শুরু করতে চান তবে আমি আপনাকে ব্যবহার করার দরকার মনে করি না scripts। টাইপিং npm startবা node app.jsএকই প্রচেষ্টা আছে।

তবে আপনি যদি ব্যবহার করতে চান nodemonএবং একটি গতিশীল যুক্তি পাস করতে চান তবে ব্যবহার করবেন নাscript । পরিবর্তে sylink ব্যবহার করার চেষ্টা করুন।

উদাহরণস্বরূপ সঙ্গে মাইগ্রেশন ব্যবহার করে 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। এটির সাথে সমস্যা হ'ল এটি সর্বদা স্ক্রিপ্টের শেষে যুক্তি যুক্ত করে। এর অর্থ সমস্ত শৃঙ্খলাবদ্ধ স্ক্রিপ্টগুলি এই আর্গুমেন্টগুলি পায় না (আরগস সম্ভবত সকলের প্রয়োজন হয় নাও হতে পারে তবে এটি একটি ভিন্ন গল্প story)। আরও যখন লিঙ্কযুক্ত স্ক্রিপ্টগুলি কল করা হয় তখন সেই স্ক্রিপ্টগুলি পাস করা আর্গুমেন্টগুলি পাবে না। অর্থাৎ watchস্ক্রিপ্টটি পাস করা যুক্তিগুলি পাবে না।

আমার অ্যাপ্লিকেশন এর উত্পাদন ব্যবহার হিসাবে একটি .exe , সুতরাং এক্সে আর্গুমেন্টগুলি উত্তীর্ণ করা ভাল কাজ করে তবে বিকাশের সময় যদি এটি করতে চান তবে তা পরীক্ষামূলক হয়ে যায়।

এটি অর্জনের জন্য আমি কোনও সঠিক উপায় খুঁজে পাইনি, তাই এটি চেষ্টা করেছি।

আমি একটি জাভাস্ক্রিপ্ট ফাইল তৈরি করেছি: start-script.jsঅ্যাপ্লিকেশনটির মূল স্তরে আমার একটি "default.package.json" আছে এবং "প্যাকেজ.জসন" রক্ষণাবেক্ষণের পরিবর্তে, আমি "default.package.json" বজায় রেখেছি। এর উদ্দেশ্য start-script.jsonহ'ল এই লিপিগুলিতে পাস হওয়া আর্গুমেন্টগুলি পড়া default.package.json, scriptsসন্ধান এবং অনুসন্ধান করা npm run scriptname। এর পরে, এটি একটি নতুন তৈরি করবে 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

আমাকে কথা বলতে দাও। আমি আমার প্যাকেজ.জসন ফাইলটিতে একটি শর্ট স্ক্রিপ্ট কমান্ড রাখতে এবং একই সাথে - নাম যুক্তি সরবরাহ করতে চেয়েছিলাম

উত্তরটি কিছু পরীক্ষা-নিরীক্ষার পরে এসেছিল। প্যাকেজ.জসনে আমার কমান্ডটি এখানে

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

... এবং এটি ব্যবহারকারীর জন্য বীজ ফাইল তৈরি করতে টার্মিনালে এটি চালনার উদাহরণ

> yarn seed:generate --name=user

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

অবগতির জন্য

yarn -v
1.6.0

npm -v
5.6.0

2
এটি কি একই কৌশল যা ২০১৩ সালে গৃহীত উত্তরে ফিরে গিয়ে ব্যাখ্যা করেছিল -- --arg1, ...?
ড্যান ড্যাসকলেসকু

2
ঠিক আছে, তাহলে কেন উত্তর পুনরাবৃত্তি?
ড্যান ড্যাসকলেসকু

আমি ব্যবহারের একটি স্বতন্ত্র উদাহরণ ভাগ করেছি, এটা কি স্পষ্ট নয়?
সার্জ সেলেটসকি

2
যদি আমি ইতিমধ্যে একটি ভিন্ন উত্তরে ব্যাখ্যা করা কোনও কৌশলটির জন্য অন্য একটি উদাহরণ ভাগ করতে চাই, তবে আমি উত্তরটিতে মন্তব্য হিসাবে আমার উদাহরণটি যুক্ত করব।
ড্যান ড্যাসকলেসকু


0

এনপিএম রান স্ক্রিপ্ট_আরজেট - <যুক্তি> মূলত কমান্ড লাইন আর্গুমেন্টগুলি পাস করার উপায় এটি তবে কেবল তখনই কাজ করবে যখন স্ক্রিপ্টের কেবল একটি কমান্ড চলবে যেমন আমি কমান্ড চালাচ্ছি যেমন এনপিএম রান শুরু - 4200

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

এটি কমান্ড লাইন প্যারামিটারগুলি পাস করার জন্য চলবে তবে আমরা যদি আরও বেশি রান করি তবে এনপিএম রান বিল্ড সি: / ওয়ার্কস্পেস / ফাইলের মতো এক কমান্ড একসাথে হবে

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

তবে অনুলিপিটি সি: / ফাইল এবং & এনজি বিল্ড সি: / ওয়ার্ক স্পেস / ফাইল চালানোর সময় এইরকম দোভাষী হবে এবং আমরা এই অনুলিপিটির মতো কিছু আশা করি সি: / ফাইল সি: / ওয়ার্ক স্পেস / ফাইল এবং & এনজি বিল্ড

দ্রষ্টব্য: - সুতরাং স্ক্রিপ্টে কেবলমাত্র একটি আদেশের ক্ষেত্রে কমান্ড লাইন প্যারামিটার কেবলমাত্র বিজ্ঞাপনের কাজ করে।

আমি উপরের কয়েকটি উত্তর পড়েছি যার মধ্যে কিছু লিখেছেন যে আপনি $ চিহ্ন ব্যবহার করে কমান্ড লাইন প্যারামিটারটি অ্যাক্সেস করতে পারেন তবে এটি কাজ করবে না


0

আমি জানি ইতিমধ্যে একটি অনুমোদিত উত্তর আছে, তবে আমি এই জেএসএন পদ্ধতির পছন্দ করি।

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

সাধারণত আমার 1 টির মতো প্রয়োজন যেমন একটি প্রকল্পের নাম, তাই আমি এই দ্রুত এনটিকে সহজ বলে মনে করি।

এছাড়াও আমি আমার প্যাকেজ.জসনে প্রায়শই এরকম কিছু করি

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

এবং লোভী হয়ে আমি "এটির সমস্ত", NODE_ENV এবং সিএমডি লাইনটি আর্গ স্টাফ চাই।

আপনি কেবল নিজের ফাইলে এই জিনিসগুলি অ্যাক্সেস করতে পারেন (আমার ক্ষেত্রে স্থানীয়.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 বিটিডব্লু চলছে)

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

যাইহোক, প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে। ভেবেছি আমি ভাগ করে নেব, কারণ আমি এই পদ্ধতিটি প্রচুর ব্যবহার করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.