নোড_মডিউলগুলিতে স্থানীয়ভাবে ইনস্টল করা প্যাকেজ থেকে এক্সিকিউটেবল কীভাবে ব্যবহার করবেন?


493

আমি কীভাবে মডিউলটির স্থানীয় সংস্করণ ব্যবহার করব node.js। উদাহরণস্বরূপ, আমার অ্যাপে আমি কফি-স্ক্রিপ্ট ইনস্টল করেছি:

npm install coffee-script

এটি এটি ইনস্টল করে ./node_modulesএবং কফি কমান্ডটি ভিতরে ./node_modules/.bin/coffee। আমি যখন আমার প্রকল্পের মূল ফোল্ডারে থাকি তখন কি এই আদেশটি চালানোর কোনও উপায় আছে? আমার ধারণা আমি bundle execবান্ডলারের অনুরূপ কিছু সন্ধান করছি । মূলত, আমি কফি-স্ক্রিপ্টের একটি সংস্করণ নির্দিষ্ট করতে চাই যা প্রকল্পের সাথে জড়িত প্রত্যেকেরই ব্যবহার করা উচিত।

আমি জানি যে আমি -gবিশ্বব্যাপী এটি ইনস্টল করতে পতাকাটি যুক্ত করতে পারি তাই কফি যে কোনও জায়গায় সূক্ষ্মভাবে কাজ করে, তবে যদি আমি প্রতি প্রকল্পে কফির বিভিন্ন সংস্করণ পেতে চাই?


9
আমি পড়ার প্রচুর নির্দেশাবলী npm install niftycommandআবার পছন্দ মতো জিনিস বলে niftycommand। তবে আপনার পথে যদি আপনার ./node_modules/.bin না থাকে তবে এটি কখনই কাজ করবে না?
বেনেট ম্যাকএলউই

2
এখানে একটি খুব ভাল রাইটআপ রয়েছে : ফার্স্টডোইট // Bas এইটি আপনাকে টার্মিনাল থেকে এনএমপি রান বিল্ডের মতো বিভাগে আপনার coffeeকমান্ডটি রাখার পরামর্শ দেয়। npm scripts"build": "coffee -co target/directory source/directoy", so you can run
বেনি নিউজবাউয়ার

@ বেনিনিউজবাউর প্রকৃতপক্ষে, এটিই আমি প্যাথ
ঝামেলা করার

12
ব্যবহারের npxযা দিয়ে আসে npm 5.2.0 medium.com/@maybekatz/...
onmyway133

উত্তর:


567

আপডেট : Seyeong Jeong নীচে তাদের উত্তরে উল্লেখ করেছেন, এনপিএম 5.2.0 থেকে আপনি ব্যবহার করতে পারেন npx [command], যা আরও সুবিধাজনক।

5.2.0 এর আগে সংস্করণগুলির জন্য পুরানো উত্তর :

লাগাতে সমস্যা

./node_modules/.bin

আপনার পাঠ্যপথের মধ্যে এটি কেবল তখনই কাজ করে যখন আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি আপনার প্রকল্প ডিরেক্টরি কাঠামোর মূল (যেমন এর অবস্থান) node_modules )

আপনার ওয়ার্কিং ডিরেক্টরিটি যা স্বাধীন তা আপনি স্থানীয়ভাবে ইনস্টল করা বাইনারিগুলির পথ পেতে পারেন the

npm bin

আপনি coffeeপ্রকল্প ডিরেক্টরি শ্রেণিবদ্ধ যেখানে থাকেন স্থানীয়ভাবে ইনস্টল করা বাইনারিগুলি কার্যকর করতে আপনি এই ব্যাশ নির্মাণটি ব্যবহার করতে পারেন

PATH=$(npm bin):$PATH coffee

আমি এটিকে এনপিএম-এক্সিকিউটে রেখেছি

alias npm-exec='PATH=$(npm bin):$PATH'

সুতরাং, এখন আমি পারি

npm-exec coffee

আমি যেখানেই থাকি না কেন কফির সঠিক কপি চালাতে

$ pwd
/Users/regular/project1

$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee

17
আপনি আরও একধাপ এগিয়ে যেতে পারেন এবংalias coffee="npm-exec coffee"
নিয়মিত

6
আপনি অন্য প্রকল্পে সিডি করলে আউটপুট পরিবর্তন হয় changes আপনি কোনও প্রকল্পের মধ্যে সিডি করার সময় এটি পরিবর্তন হয় না। npm binনোড_মডিউলস ডিরেক্টরিগুলির জন্য সিডব্লিউডে 'পূর্বপুরুষের ডিরেক্টরিগুলি' এর চেইন অনুসন্ধান করে। আপনি যদি বিশেষত প্রকল্পের প্যাকেজ.জসনে তালিকাভুক্ত মডিউলগুলির বাইনারি ব্যবহার করতে চান তবে এটি হ'ল কাঙ্ক্ষিত আচরণ।
নিয়মিত

11
হায় হায় ভগবান! আমার স্থানীয় মডিউলগুলি কাজ করার জন্য আমাকে কি সত্যিই এমন কিছু করতে হবে? এটি একটি দলকে ব্যাখ্যা করা বেশ অবাস্তব! কিছুটা সোজা আর কিছু নেই?
অ্যালেক্সিয়ান

17
আপনি সর্বদা এনএমপি স্ক্রিপ্টগুলি ব্যবহার করতে পারেন যেহেতু তারা সর্বদা স্থানীয় বাইনারিগুলি অনুসন্ধান করে। আপনি সেখানে আপনার প্রতিটি বাইনারিগুলির জন্য উপকরণ স্থাপন করতে পারেন বা "বিল্ড" এর মতো জেনেরিক নাম ব্যবহার করতে পারেন।
জো জিম

6
@ ফিলোসোডাড, আসলে না, আপনি করবেন না। PATHকি এটা কমান্ড আবাহন সামনে ছিল ফিরে আসবে। কমান্ড চালানোর আগে একই লাইনে পরিবেশের পরিবর্তনশীল সেট করা কেবলমাত্র সেই আদেশের পরিবেশকে প্রভাবিত করে।
নিয়মিত

410

চমৎকার উদাহরণ

আপনাকে $PATHআর হেরফের করতে হবে না!

থেকে npm@5.2.0 , npm সঙ্গে জাহাজ npxপ্যাকেজ যা আপনাকে একটি স্থানীয় থেকে কমান্ড সঞ্চালন করুনnode_modules/.bin বা একটি কেন্দ্রীয় ক্যাশে থেকে।

সহজভাবে চালান:

$ npx [options] <command>[@version] [command-arg]...

ডিফল্টরূপে, স্থানীয় প্রকল্প বাইনারিগুলির মধ্যে রয়েছে npxকিনা তা যাচাই করবে এবং এটি কার্যকর করবে।<command>$PATH

ইতিমধ্যে আপনার না থাকা npx <command>অবস্থায় কল করা <command>আপনার $PATHজন্য NPM রেজিস্ট্রি থেকে স্বয়ংক্রিয়ভাবে সেই নামের সাথে একটি প্যাকেজ ইনস্টল করবে এবং এটিকে অনুরোধ করবে। এটি হয়ে গেলে, ইনস্টল করা প্যাকেজটি আপনার গ্লোবালগুলিতে কোথাও থাকবে না, সুতরাং আপনাকে দীর্ঘমেয়াদে দূষণ সম্পর্কে চিন্তা করতে হবে না। --no-installবিকল্প সরবরাহ করে আপনি এই আচরণটি প্রতিরোধ করতে পারেন ।

এর জন্য npm < 5.2.0, আপনি npxনিম্নলিখিত কমান্ডটি চালিয়ে প্যাকেজটি ম্যানুয়ালি ইনস্টল করতে পারেন :

$ npm install -g npx

1
আমি তৃতীয় পক্ষের গ্লোবাল এনপিএম প্যাকেজ ইনস্টল করতে চাই না npmএবং package.jsonপ্রায় একই কার্যকারিতা সরবরাহ করি।
guneysus

: যদি "। পাথ একটি স্ট্রিং হতে হবে গৃহীত undefined" বার্তা প্রদর্শিত হয়, এখানে একটি ফিক্স আছে github.com/zkat/npx/issues/144#issuecomment-391031816
ভ্যালেরি Katkov

1
এই উত্তর ভাল। তবে আমি কেবল বলতে চাই npxলঙ্গা। এটা বা কিছু npm runবা হওয়া উচিত ছিল npm exec
উইলিয়াম এন্টারিকেন

@ উইলিয়ামএন্ট্রিকেন কিছু কারণে, npm run [my-local-package]আমার উবুন্টুতে কাজ করছে না, যদিও এটি উইন্ডোজ ডিভাইসে কাজ করছে বলে মনে হচ্ছে।
ক্লকওয়ার্ক

97

npm binআপনার প্রকল্পের নোড মডিউল / বিন ডিরেক্টরি পেতে কমান্ডটি ব্যবহার করুন

$ $(npm bin)/<binary-name> [args]

যেমন

$ $(npm bin)/bower install

4
আমি এই সহজ এবং জেনেরিক সমাধানটি পছন্দ করি। একটি উপনামকে অপ্রয়োজনীয় মনে হয়।
ম্যাট মন্টাগ

export PATH="./node_modules/.bin:$PATH"
করানোর

1
@ inf3rno কমান্ডটি $(npm bin)/jasmineনয়, node $(npm bin)/jasmine(আপনি সম্ভবত এটি সন্ধান করেছেন তবে অন্যের জন্য স্পষ্ট করে দিয়েছেন)।
jassa

5
কোনও খারাপ সমাধান নয়, তবে এটি standard সহ কোনও স্ট্যান্ডার্ড উইন্ডোজ কমান্ড লাইনে চলে না $ এটি প্যাকেজ.জসন স্ক্রিপ্টস বিভাগে রাখা আরও ভাল পদ্ধতির সাথে আমার মনে হয়, কারণ এটি আরও সামঞ্জস্যপূর্ণ।
তীমথিয় গঞ্জালেজ

77

ব্যবহার npm run[-script] <script name>

আপনার স্থানীয় ./node_modulesডিরেক্টরিতে বিন প্যাকেজ ইনস্টল করতে এনপিএম ব্যবহার করার পরে, এই জাতীয় সংযোজনটি সংশোধন package.jsonকরুন <script name>:

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

এনপিএম ইনস্টল-এ - এডিডি-স্ক্রিপ্ট বিকল্প বা অন্য কিছু থাকলে বা এনপিএম রান স্ক্রিপ্ট ব্লকে যোগ না করে কাজ করতে পারলে এটি দুর্দান্ত।


5
কোনও প্রকল্পে একাধিক বিকাশকারীদের সাথে কথা বলার সময় আমি এই পদ্ধতিকে আরও অভিন্ন বলে মনে করেছি - এটি স্থানীয়ভাবে কোনও কিছু কনফিগার করার প্রয়োজনকে এড়িয়ে চলে ... আপনার ঠিক npm installতখনই আপনার ডেভ নির্ভরতাতে অ্যাক্সেস রয়েছে। একমাত্র গৌণ নিচের দিকটি আপনার npm run eslint(বা যাই হোক না কেন) দরকার। আপনি "স্টার্ট" নামে একটি স্ক্রিপ্ট তৈরি করতে পারেন যা গাল্প চালায় যাতে npm startআপনার ডেভ সার্ভারটি শুরু করতে আপনাকে কেবল টাইপ করতে হবে। খুব দুর্দান্ত স্টাফ এবং কোনও ধার্মিকতা নেই, তাই আপনার উইন্ডোজ বন্ধুরা আপনাকে এখনও পছন্দ করে। :)
jpoveda

1
আপনার পথে alias (এনপিএম বিন) রাখার জন্য একটি উপনাম যুক্ত করা চতুর, তবে এটি যে স্থানীয় কনফিগারেশন ছাড়াই লোকের পক্ষে কাজ করবে তা আমার হৃদয় জয় করে
Conrad.Dean

12
এই আরও upvotes প্রয়োজন! আপনার স্ক্রিপ্টগুলিতে --লাইক দেওয়ার পরে npm run learnyounode -- --normal-switches --watch -d *.js
আরোগুলি

আমি এটি সেরা সমাধান খুঁজে। এখানে একটি গভীরতার ব্যাখ্যা রয়েছে: লস্টেচিজস
এডারিকবাইলি

1
এটি আমি সাধারণত যা করতে চাই, তবে কোনও কারণে উবুন্টু ডিভাইসে npm run ts-nodeআমার পক্ষে কাজ করে না। আমাকে শুধু এনপিএক্স-এ পুনরায় সংবেদন করতে হবে।
ক্লকওয়ার্ক

42

ব্যবহার npm-run

রিডমি থেকে:

npm রানের

নোড_মডিউলগুলি থেকে স্থানীয় এক্সিকিউটেবলগুলি সন্ধান করুন এবং চালান

এনপিএম লাইফাইসাইকেল স্ক্রিপ্টে যে কোনও এক্সিকিউটেবল উপলব্ধ npm-run

ব্যবহার

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

স্থাপন

$ npm install -g npm-run

8
আর npx উপরে ... রেফারেন্সড দেখুন stackoverflow.com/a/45164863/3246805
TJ

41

আপডেট: আমি উল্লিখিত সুরক্ষার কারণে এবং কমপক্ষে নতুন npm binকমান্ডের জন্য নয়, উভয়ই এই পদ্ধতির সুপারিশ করব না । নীচে মূল উত্তর:

আপনি খুঁজে পাওয়া যায় যে, কোন স্থানীয়ভাবে ইনস্টল বাইনেরিতে হয় ./node_modules/.bin। বিশ্বব্যাপী উপলভ্য বাইনারিগুলির চেয়ে এই ডিরেক্টরিতে সর্বদা বাইনারিগুলি চালনার জন্য, যদি উপস্থিত হয়, আমি আপনাকে পরামর্শ দিই যে আপনি ./node_modules/.binনিজের পথে প্রথমে থাকুন:

export PATH="./node_modules/.bin:$PATH"

আপনি আপনার এই করিয়ে দিলে ~/.profile, coffeeসবসময় হতে হবে ./node_modules/.bin/coffeeযদি পাওয়া যায়, অন্যথায় /usr/local/bin/coffee(অথবা যাই হোক না কেন পূর্বে ভী আপনি অধীনে নোড মডিউল ইনস্টল করছেন)।


1
সম্ভবত এটিই সেরা সমাধান। আমি আমার প্রকল্পে "ঘড়ি" নামে একটি বাশ স্ক্রিপ্টও তৈরি করেছি:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
টাইপনেয়ার

72
বিপদ, উইল রবিনসন! আপনার AT PATH- এ আপেক্ষিক পাথের ব্যবহার কোনও গ্রহের আকারের সুরক্ষা গর্ত উন্মুক্ত করে, বিশেষত যদি আপনি এটিকে প্রথম আইটেম হিসাবে ডানদিকে রেখে দেন। তাহলে ডিরেক্টরির আপনি আছেন সবাই লেখারযোগ্য (কোথাও বলে /tmp), কোন প্রক্রিয়া বা ব্যবহারকারী (মতো সাধারণ কম্যান্ডের দূষিত সংস্করণ রেখে আপনার সেশন হাইজ্যাক করতে পারেন ls, cpইত্যাদি) আছে। এগুলি আপনার পাসওয়ার্ড, ইত্যাদি ইত্যাদি ক্যাপচার করে 'অদৃশ্য' সাব-শেলগুলি উত্সাহিত করতে পারে।
ack

কেবলমাত্র রুটে কাজ করবে এবং অন্য কোনও স্থানে থাকবে না। alias npm-exec='PATH=$(npm bin):$PATH'মসৃণ হয়।
অলিগোফ্রেন 16

1
এটি যদি আপনার প্রথম জিনিস হিসাবে না রাখেন PATHতবে শেষ ( $(npm bin)ফর্মটি ব্যবহার করে ) এটি কতটা খারাপ? সুতরাং তারা আপনার বিদ্যমান জিনিসগুলি ওভাররাইট করতে পারে না, এবং আপনি npm binডিরেক্টরিটিতে নির্বাহীদের ইতিমধ্যে ভেরাই নির্বিশেষে বিশ্বাস করে থাকবেন PATH; হুমকির মডেলটি হ'ল ক) দূষিত কেউ আপনার ফাইল সিস্টেমে অ্যাক্সেস পেয়েছে, খ) তারা those সিস্টেম সরঞ্জামগুলির নিকটে থাকা নামের সাথে এক্সিকিউটেবল যুক্ত করে এবং গ) আপনি ভুল টাইপ করেন? এই npmইনস্টল করা প্রোগ্রামগুলি ব্যবহার করার সময় আপনি ইতিমধ্যে বিদেশী এক্সিকিউটেবলের উপর বিশ্বাস রাখছেন এই প্রদত্ত পরিস্থিতিগুলি বোঝার চেষ্টা করছেন bad
ওসদিব

আপনি একটি উলের সাথে শেল ট্রিক করতে পারেন এবং আপনি ম্যানুয়ালি পাথ করতে পারেন এবং এটি "কাজ করে" তবে এটি বেশ আদর্শ নয়।
কিলস্ক্রিন

22

PATH সমাধানটিতে এই সমস্যাটি রয়েছে যে যদি। (এনপিএম বিন) আপনার। প্রোফাইল / .bashrc / ইত্যাদিতে স্থাপন করা হয় তবে এটি একবার মূল্যায়ন করা হয় এবং যে পথটি প্রথমে মূল্যায়ন করা হয়েছিল সেই ডিরেক্টরিতে চিরতরে সেট করা থাকে instead পরিবর্তে আপনি যদি বর্তমান পথটি পরিবর্তন করেন তবে যতবার আপনি স্ক্রিপ্টটি চালান আপনার পথটি বাড়বে।

এই সমস্যাগুলি সম্পর্কে জানতে, আমি একটি ফাংশন তৈরি করেছি এবং এটি ব্যবহার করেছি। এটি আপনার পরিবেশ পরিবর্তন করে না এবং এটি ব্যবহার করা সহজ:

function npm-exec {
   $(npm bin)/$@  
}

এটি আপনার পরিবেশে কোনও পরিবর্তন না করেই এভাবে ব্যবহার করা যেতে পারে:

npm-exec r.js <args>

2
আমি এই পছন্দ! আমি কেবল আমার ফাংশনটির নাম দিয়েছিn
joutsai

এটা অসাধারণ! ভাগ করে নেওয়ার জন্য ধন্যবাদ. আমি নীচে একটি ফিশ শেল সংস্করণ যুক্ত করেছি।
লিওন - হ্যান লি

22

আপনি যদি এনএমপি রাখতে চান, তবে এনপিএক্স আপনার যা প্রয়োজন তা করা উচিত।


যদি সুতোর কাছে স্যুইচ করা হয় (ফেসবুকের মাধ্যমে এনপিএম রিপ্লেসমেন্ট) আপনার জন্য একটি বিকল্প হয় তবে আপনি কল করতে পারেন:

 yarn yourCmd

প্যাকেজ.জসনের অভ্যন্তরে স্ক্রিপ্টগুলি অগ্রাধিকার নেবে, যদি কোনওটি পাওয়া না যায় তবে এটি ভিতরে প্রদর্শিত হবে ./node_modules/.bin/ ফোল্ডারের ।

এটি যা চালিয়েছিল তা আউটপুট করে:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

সুতরাং আপনার প্রতিটি কমান্ডের জন্য আপনাকে স্ক্রিপ্টগুলি সেটআপ করতে হবে না package.json


যদি আপনার .scriptsভিতরে কোনও স্ক্রিপ্ট সংজ্ঞায়িত থাকে package.json:

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tscসমতূল্য হবে yarn run tscবা npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc

14

আপডেট: আপনি সাম্প্রতিক এনপিএম এ থাকলে (সংস্করণ> 5.2)

তুমি ব্যবহার করতে পার:

npx <command>

npx.binআপনার ডিরেক্টরিতে কমান্ড সন্ধান করেnode_modules

পুরানো উত্তর:

উইন্ডোজ জন্য

নিম্নলিখিত ফাইল হিসাবে একটি স্টোর সংরক্ষণ করুন npm-exec.batএবং এটি আপনার যুক্ত করুন%PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*

ব্যবহার

তারপরে আপনি এটির মতো ব্যবহার করতে পারেন npm-exec <command> <arg0> <arg1> ...

উদাহরণ স্বরূপ

wdioস্থানীয় নোড_মডিউলগুলি ডিরেক্টরিতে ইনস্টল করার জন্য , করুন:

npm-exec wdio wdio.conf.js

অর্থাৎ এটি চলবে .\node_modules\.bin\wdio wdio.conf.js


1 টির বেশি যুক্তি পাস করার সময় এটি কাজ করে না। উদাহরণস্বরূপ এনপিএম-এক্সিকিউট গুল্প <সোম_ টাস্ক>
OK999

@ Ok9999 আমি নিশ্চিত যে কিছুটা ছোটখাট পরিবর্তন তদন্তের তর্কগুলি মঞ্জুরি দেবে (কারণ আপনি যখন এটি এখানে পাস করবেন তখন এটি "" এ উদ্ধৃত হয়ে আসছে); আমার পরামর্শটি হ'ল বিনটি থেকে আপনার প্রকল্পের মূলটিতে গল্প ফাইলটি অনুলিপি করুন (ফাইলটির কিছু পরিবর্তন প্রয়োজন তবে এটি নতুন কোড ইত্যাদি না লিখেই কাজ করবে)
ধীররাজ ভাস্কর

হ্যাঁ, আমি এটা করে শেষ করেছি। নোড_মডিউলস ফোল্ডারটি সেই ফোল্ডারে থাকতে হবে যেখানে গলফিল রয়েছে
OK999

6

আমি শেল এলিয়াস বা অন্য কোনও প্যাকেজের উপর নির্ভর না করা পছন্দ করি।

scriptsআপনার বিভাগে একটি সাধারণ লাইন যুক্ত করে package.jsonআপনি স্থানীয় এনপিএম কমান্ডগুলি চালাতে পারেন

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}

5

যদি আপনি চান যে আপনার PATH ভেরিয়েবলটি আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরিটির উপর ভিত্তি করে সঠিকভাবে আপডেট করতে চান, তবে এটি আপনার .bashrcগুণমানের শেষে (বা যে কোনও কিছু সংজ্ঞায়িত করার পরে PATH) যুক্ত করুন:

__OLD_PATH=$PATH
function updatePATHForNPM() {
  export PATH=$(npm bin):$__OLD_PATH
}

function node-mode() {
  PROMPT_COMMAND=updatePATHForNPM
}

function node-mode-off() {
  unset PROMPT_COMMAND
  PATH=$__OLD_PATH
}

# Uncomment to enable node-mode by default:
# node-mode

প্রতিবার যখন বাশ প্রম্পটটি রেন্ডার হয়ে যায় তখন এটি সংক্ষিপ্ত বিলম্ব যুক্ত করতে পারে (সম্ভবত আপনার প্রকল্পের আকারের উপর নির্ভর করে), তাই এটি ডিফল্টরূপে অক্ষম করে।

আপনি চালিয়ে node-modeএবং node-mode-offযথাক্রমে আপনার টার্মিনালের মধ্যে এটিকে সক্ষম এবং অক্ষম করতে পারেন ।


4

আমি এই সমস্যাটি সমাধান করার জন্য @Guneysus এর মত একই পন্থাটি সর্বদা ব্যবহার করেছি, যা প্যাকেজ.জসন ফাইলে একটি স্ক্রিপ্ট তৈরি করছে এবং এটি এনএমপি রান স্ক্রিপ্ট-নাম চলমান ব্যবহার করে।

তবে সাম্প্রতিক মাসগুলিতে আমি এনপিএক্স ব্যবহার করেছি এবং আমি এটি পছন্দ করি।

উদাহরণস্বরূপ, আমি একটি কৌণিক প্রকল্প ডাউনলোড করেছি এবং আমি বিশ্বব্যাপী কৌণিক সিএলআই ইনস্টল করতে চাইনি। সুতরাং, এনপিএক্স ইনস্টল করার সাথে বৈশ্বিক কৌণিক ক্লাইম কমান্ডটি ব্যবহার না করে (যদি আমি এটি ইনস্টল করে রেখেছি):

ng serve

আমি কনসোল থেকে এটি করতে পারি:

npx ng serve

এনপিএক্স সম্পর্কে আমি এখানে একটি নিবন্ধ লিখেছি এবং এটি এর গভীরে যায়।


2

zxc নোডেজের জন্য "বান্ডেল এক্সিকিউটিভ" এর মতো। এটি ব্যবহারের অনুরূপ PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp


1

আপনি ডার্নিভ ব্যবহার করতে পারেন এবং কেবলমাত্র আপনার কার্যকরী ফোল্ডারে AT PATH ভেরিয়েবল পরিবর্তন করতে পারেন।

$ cat .envrc
> export PATH=$(npm bin):$PATH

1

আপনার এই স্ক্রিপ্ট যোগ করুন .bashrc। তারপরে আপনি coffeeস্থানীয়ভাবে কল বা যেকোনও কল করতে পারেন । এটি আপনার ল্যাপটপের জন্য কার্যকর, তবে এটি আপনার সার্ভারে ব্যবহার করবেন না।

DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;

দ্রষ্টব্য : এই স্ক্রিপ্টটি cdকমান্ডের উপকরণ তৈরি করে এবং এর প্রতিটি কলের পরে cdএটি পরীক্ষা করে node_modules/.binএটি আপনার যুক্ত করে$PATH

নোট 2 : আপনি তৃতীয় লাইনটি এতে পরিবর্তন করতে পারেন NODE_MODULES=$(npm bin);। কিন্তু এটি cdকমান্ডটি খুব ধীর করে দেবে।


1
$(npm bin)হার্ডকডিংয়ের পরিবর্তে ব্যবহার করুন ./node_modules/.bin
bfontaine

হুম, $(npm bin)প্রতিটি cdকমান্ডের সাহায্যে খুব ধীর বলে মনে হচ্ছে । আমি কোডটি পুনরুদ্ধার করেছি এবং এর জন্য একটি নোট যুক্ত করেছি।
সুস্টোমু কাওয়ামুরা

1

উইন্ডোজের জন্য এটি ব্যবহার করুন:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version

0

আমি একই সমস্যাটির মুখোমুখি হয়েছি এবং আমি বিশেষত এলিয়াসগুলি ব্যবহার করতে পছন্দ করি না ( নিয়মিত প্রস্তাবিত হিসাবে), এবং আপনি যদি সেগুলিও পছন্দ করেন না তবে এখানে আমি ব্যবহার করি এমন আরও একটি কার্যপ্রণালী এখানে আপনাকে প্রথমে একটি ক্ষুদ্র এক্সিকিউটেবল বাশ স্ক্রিপ্ট তৈরি করতে হবে, setenv.sh বলুন :

#!/bin/sh

# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"

# execute the rest of the command
exec "$@"

এবং তারপরে আপনি /binএই কমান্ডটি ব্যবহার করে আপনার স্থানীয় কোনও এক্সিকিউটেবল ব্যবহার করতে পারেন :

./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt

আপনি যদি scriptsপ্যাকেজ.জসনে ব্যবহার করছেন তবে:

...,
scripts: {
    'start': './setenv.sh <command>'
}

2
এই setenv স্ক্রিপ্টটি প্যাকেজ.জসন স্ক্রিপ্টগুলির জন্য প্রয়োজনীয় নয়। এনপিএম ইতিমধ্যে স্থানীয় নোড_মডিউলগুলি / .বিন ডিরেক্টরিটি আপনার জন্য এনপ্যাম চালানো {স্ক্রিপ্টগুলি exec চালানোর সময় পাঠায়}
জেসনকার্নস

0

আমি এটি সুরক্ষিত / খারাপ ধারণা কিনা তা জানতে আগ্রহী, তবে কিছুটা চিন্তা করার পরে আমি এখানে কোনও সমস্যা দেখছি না:

এটি শেষের দিকে যুক্ত করার জন্য লিনাসের অনিরাপদ সমাধানটিকে সংশোধন করা, npm binডিরেক্টরিটি সন্ধান করার জন্য এবং স্ক্রিপ্টটি কেবল npm binতখনই কল করা হয় যখন package.jsonকোনও পিতামাতার সাথে উপস্থিত হয় (গতির জন্য), আমি এটাই এনেছি zsh:

find-up () {
  path=$(pwd)
  while [[ "$path" != "" && ! -e "$path/$1" ]]; do
    path=${path%/*}
  done
  echo "$path"
}

precmd() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi
}

কারণ bash, precmdহুক ব্যবহারের পরিবর্তে , আপনি $PROMPT_COMMANDভেরিয়েবলটি ব্যবহার করতে পারেন (আমি এটি পরীক্ষা করেছি না তবে আপনি ধারণাটি পেয়েছেন):

__add-node-to-path() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi   
}

export PROMPT_COMMAND="__add-node-to-path"

এর npm binশেষে যুক্ত করা $PATHব্যবহারকারীর প্রত্যাশাটিকে কার্যকর করতে পারে না: মূলত অন্য একটি এক্সিকিউটেবল তবে সম্ভবত অন্য একটি সংস্করণ সহ বিশ্বব্যাপী ইনস্টল করা প্যাকেজ!
লোগানমজ

0

আমি একজন Windowsব্যবহারকারী এবং এটিই আমার পক্ষে কাজ করেছে:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

শুভকামনা


0

আপনি যদি ব্যবহার করছেন fish shellএবং $pathসুরক্ষার কারণে যুক্ত করতে চান না সে ক্ষেত্রে । স্থানীয় নোড এক্সিকিউটেবলগুলি চালাতে আমরা নীচের ফাংশনটি যুক্ত করতে পারি।

### run executables in node_module/.bin directory
function n 
  set -l npmbin (npm bin)   
  set -l argvCount (count $argv)
  switch $argvCount
    case 0
      echo please specify the local node executable as 1st argument
    case 1
      # for one argument, we can eval directly 
      eval $npmbin/$argv
    case '*'
      set --local executable $argv[1]
      # for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2... 
      # This is just how fish interoperate array. 
      set --erase argv[1]
      eval $npmbin/$executable $argv 
  end
end

এখন আপনি এই জাতীয় জিনিস চালাতে পারেন:

n coffee

বা আরও যুক্তি যেমন:

n browser-sync --version

দ্রষ্টব্য, আপনি যদি bashব্যবহারকারী হন তবে @ Bob9630 জবাবগুলি হ'ল বাশকে লাভবান করে যাবার উপায় $@যা পাওয়া যায় না fishshell


-9

প্রতিটি প্রকল্পে প্রয়োজনীয় নির্দিষ্ট সংস্করণ সহ প্যাকেজ.জসনে কফি-স্ক্রিপ্ট অন্তর্ভুক্ত করুন, সাধারণত:

"dependencies":{
  "coffee-script": ">= 1.2.0"

তারপরে প্রতিটি প্রকল্পের নির্ভরতা ইনস্টল করতে এনপিএম ইনস্টল চালান। এটি কফি-স্ক্রিপ্টের নির্দিষ্ট সংস্করণ ইনস্টল করবে যা প্রতিটি প্রকল্পে স্থানীয়ভাবে অ্যাক্সেসযোগ্য হবে।


হ্যাঁ, আমি আমার প্রশ্নে যা বলেছি তা পেয়েছি। আমার প্রকল্পে আমি কীভাবে বিশেষভাবে কল করব?।
টাইপনেয়ার

আপনি যদি আপনার প্রকল্পের প্রধান ফোল্ডারে প্যাকেজ.জসনের সাথে এনপিএম ইনস্টল করেন তবে আপনার এই ফোল্ডারে একটি ./node_modules/.bin/c کافی ফোল্ডার থাকা উচিত। । / নোড_মডিউলস / কফি -স্ক্রিপ্ট / বিন / কফি ব্যবহার করা কফির স্থানীয় সংস্করণটি চালিত করবে যখন কেবল কফি চালানো বিশ্বব্যাপী ইনস্টলেশন চালাবে। আপনার যদি এই প্রকল্প ফোল্ডারের মধ্যে অন্য পথে কফির আরও একটি সংস্করণ ইনস্টল করা থাকে তবে আপনি ./path/to/this/installation/coffee ব্যবহার করে এটি অ্যাক্সেস করতে পারেন।
almypal

এটি আমার পক্ষে কার্যকর হয়নি। আমি "এসভিগো" ব্যবহার করার চেষ্টা করছি এবং এটি কেবল বিশ্বব্যাপী ইনস্টল করার পরে কাজ করে। আমি প্যাকেজ.জসনের npm install svgoপাশাপাশি চেষ্টা npm installকরেছি। উভয় পদ্ধতি "সাফল্যের সাথে" ইনস্টল করা হয়েছে, তবে "svgo" কমান্ডটি এখনও পাওয়া যায় না।
রায়ান হুইল

1
গ্রান্ট এটিকে চালাক পদ্ধতিতে ব্যবহার করে এবং আইএমএইচওও অন্যান্য প্যাকেজগুলির উচিত। প্রথমে আপনি grunt-cliপ্যাকেজটি বিশ্বব্যাপী ইনস্টল করুন , তারপরে আপনার প্রকল্প ডিরেক্টরিতে প্যাকেজের কোনও (সংশোধিত) সংস্করণ ইনস্টল করুন grunt, তারপরে আপনি যখন রান করবেন তখন gruntএটি এই স্থানীয় সংস্করণটি ব্যবহার করবে।
ack
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.