নোডজেএসের একটি গ্লোবাল মডিউল / প্যাকেজ প্রয়োজন


158

আমি বিশ্বব্যাপী ইনস্টল করার চেষ্টা করছি এবং তারপরে foreverএবং এর forever-monitorমতো ব্যবহার করুন :

npm install -g forever forever-monitor

আমি স্বাভাবিক আউটপুট এবং সেই অপারেশনগুলিও দেখি যা ফাইলগুলি বিশ্বব্যাপী অনুলিপি করে, তবে তারপরে যদি আমি চেষ্টা require("forever");করি তবে মডিউলটি পাওয়া যায়নি বলে একটি ত্রুটি পাই।

আমি নোড এবং এনপিএম উভয়ের সর্বশেষতম সংস্করণ ব্যবহার করছি এবং এনএমপি গ্লোবাল বনাম স্থানীয় ইনস্টলে যে পরিবর্তন হয়েছে সে সম্পর্কে আমি ইতিমধ্যে জানি, তবে আমি প্রতিটি প্রকল্পে লোকালাই ইনস্টল করতে চাই না এবং আমি এমন একটি প্ল্যাটফর্মের উপর কাজ করছি যা না করে 'সমর্থন করছি linkযাতে npm linkএকটি বিশ্বব্যাপী ইনস্টলের পরে আমার পক্ষে সম্ভব নয়।

আমার প্রশ্ন: আমি কেন বিশ্বব্যাপী ইনস্টল করা প্যাকেজটির প্রয়োজন নেই? এটি কি কোনও বৈশিষ্ট্য বা বাগ? নাকি আমি কিছু ভুল করছি?

পিএস: কেবল এটি স্ফটিক পরিষ্কার করার জন্য: আমি স্থানীয়ভাবে ইনস্টল করতে চাই না।


আমি এটি এখানেই ছেড়ে দিচ্ছি github.com/yarnpkg/yarn/issues/2049 github.com/yarnpkg/yarn/issues/2049#issuecomment-337870443
মেরেকি


সুতরাং এটি ~/.config/yarn/globalসুতার জন্য
লোকালহোস্টডটদেব

উত্তর:


215

নোড.জেজে, গ্লোবাল মডিউলগুলি ইনস্টল হওয়া ফোল্ডারে প্রয়োজন নেই in

আপনি NODE_PATH পরিবেশ পরিবর্তনশীল সেট করে এটি ঠিক করতে পারেন। লিনাক্সে এটি হবে:

export NODE_PATH=/usr/lib/node_modules

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

দেখুন: গ্লোবাল ফোল্ডারগুলি থেকে লোড হচ্ছে


24
আমার উবুন্টু 13.10 মেশিনে, মডিউলগুলির জন্য বিশ্বব্যাপী পথটি আপনি এখানে দেখানোর চেয়ে আলাদা। export NODE_PATH=/usr/local/lib/node_modulesপরিবর্তে আমাকে ব্যবহার করতে হয়েছিল।
ড্র নোকস

11
আপনি যদি উইন্ডোজ 7/8 এ থাকেন এবং নোডের কোনও ইনস্টল ডিফল্টকে ওভাররাইড না করে থাকেন, NODE_PATHপরিবেশের পরিবর্তনশীলকে C:\Users\{USERNAME}\AppData\Roaming\npm\node_modulesসম্ভবত কার্যকরভাবে কাজ করবে setting
ওয়েস জনসন

5
@ ওয়েজ জনসন জাস্ট %AppData%\npm\node_modulesউইন্ডোজ 10-এ কাজ করবে
থাইল্যাং

6
যদি আমি সেট করে থাকি তবে আমি NODE_PATHকী বিশ্বব্যাপী এবং স্থানীয় মডিউলগুলি একই সাথে ব্যবহার করতে পারি?
পাওলো অলিভিরা

6
স্থির পথের পরিবর্তে বিকল্প হিসাবে, যদি আপনি NODE_PATH=$(npm root -g)
এনভিএম

96

বিশ্বব্যাপী প্যাকেজ ইনস্টল করার পরে আপনাকে স্থানীয় প্রকল্পটি বিশ্ব প্যাকেজের সাথে সংযুক্ত করতে হবে

npm install express -g
cd ~/mynodeproject/
npm link express  

এখানে দেখুন


2
আমি এমন একটি প্ল্যাটফর্মের দিকে ছুটছি যা
alexandernst

1
আপনি কোন প্ল্যাটফর্ম ব্যবহার করছেন?
ব্যবহারকারী568109

1
আমি লিঙ্কটি নিয়ে আসলেই গোলযোগ করতে চাই না (প্রতীকী লিঙ্কগুলি মোটেও নয়)। আমি কেবল বিশ্বব্যাপী প্যাকেজ ইনস্টল করতে চাই এবং সেগুলি প্রয়োজন। আমি জানি এনপিএম এড়ানোর জন্য পুনরায় নকশা করা হয়েছিল, তবে এরকম কিছু অর্জন করা কতটা কঠিন হতে পারে?
আলেকজান্দার্নস্ট

13
আমার যদি কোন প্রজেক্ট না থাকে? বলুন ~/some-stand-alone-random-nodejs-test.js। আমি আমার হোম ফোল্ডারটিকে একটি প্রকল্প ডিরেক্টরিতে রূপান্তর করতে চাই না। আমি প্রতিটি ছোট পরীক্ষার জন্য নতুন ফোল্ডার তৈরি করতে চাই না।
আনানফায়

1
উইন্ডোজ 8.1 এ নিখুঁতভাবে কাজ করেছেন। নোড কমান্ড লাইন সিডি থেকে আমার প্রকল্পগুলির স্থানীয় নোড_মডিউলগুলি ফোল্ডারে তারপর মৃত্যুদন্ড কার্যকর করা npm link <module>হবে তারপরে আপনি গ্লোবাল নোড মডিউলটিকে উল্লেখ করে আপনার প্রকল্পের নোড_মডিউল ফোল্ডারে একটি শর্টকাট (লিঙ্ক) দেখতে পাবেন see
গতিশীলক্রমে

26

ক্ষমতার জন্য ক্ষমাপ্রার্থী তবে আমি বিশ্বব্যাপী ইনস্টলড মডিউলগুলির জন্য হার্ড-কোডেড পথগুলি নির্দিষ্ট করতে সক্ষম:

var pg = require("/usr/local/lib/node_modules/pg");

এটি নিখুঁত নয় তবে বিবেচনা করে যে ইউনিটি 3 ডি প্রকল্পের ডিরেক্টরিতে অন্তর্ভুক্ত সমস্ত জাভাস্ক্রিপ্ট "সংকলন" করার চেষ্টা করে আমি সত্যিই কোনও প্যাকেজ ইনস্টল করতে পারি না।


4
ইউনিটি 3 ডি জাভাস্ক্রিপ্ট সমর্থন করে না। এটি এর বু ইন্টারপ্রেটার / কম্পাইলারের জন্য জেএস-এর মতো সিনট্যাক্স সমর্থন করে (বু। .NET এর জন্য পাইথনের মতো ভাষা) যা "জাভাস্ক্রিপ্ট" হিসাবে প্রতারণামূলকভাবে বিপণন করে । ইউনিটি যে ভাষা সমর্থন করে তার জন্য আরও সঠিক নামটি ইউনিটিস্ক্রিপ্ট । এটি এমনকি একই ভাষার কাছাকাছি না হওয়ার কারণে, ওয়েবে বা নোড.জেসের জন্য লেখা জেএসের কোনওটির পরে ityক্যতে কাজ করবে না। অফিসিয়াল ইউনিটির উইকিতে পার্থক্য সম্পর্কে আরও বেশি তথ্য: উইকি.উইটিউটি3 ডটকম
স্লিপ ডি থম্পসন

19

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে semverকোনও preinstallস্ক্রিপ্টের সাহায্যে কিছু সংস্করণ চেক করার চেষ্টা করার সময় আমি এটিকে ছুঁড়েছি package.json। যেহেতু আমি জানতাম যে আমি ইনস্টল হওয়া কোনও স্থানীয় মডিউলগুলির উপর নির্ভর করতে পারি না, তাই আমি semverএটি বিশ্বব্যাপী node_modulesফোল্ডারটি থেকে প্রয়োজনীয় হিসাবে ব্যবহার করেছি ( npmএটির উপর নির্ভর করে আমি জানি এটি সেখানে):

function requireGlobal(packageName) {
  var childProcess = require('child_process');
  var path = require('path');
  var fs = require('fs');

  var globalNodeModules = childProcess.execSync('npm root -g').toString().trim();
  var packageDir = path.join(globalNodeModules, packageName);
  if (!fs.existsSync(packageDir))
    packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm

  if (!fs.existsSync(packageDir))
    throw new Error('Cannot find global module \'' + packageName + '\'');

  var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString());
  var main = path.join(packageDir, packageMeta.main);

  return require(main);
}

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

আমি কোনও NODE_PATHসমাধানের সাথে যাইনি যেমন অন্যরা পরামর্শ দিয়েছিল যেহেতু আমি এটি চালানোর আগে অতিরিক্ত কনফিগারেশন / সেটআপের প্রয়োজন ছাড়াই কারও মেশিনে কাজ করতে চেয়েছিলামnpm install আমার প্রকল্পের জন্য ।

এটি যেভাবে কোড করা হয়েছে, কেবলমাত্র এটি শীর্ষ স্তরের মডিউলগুলি (ব্যবহার করে ইনস্টল করা npm install -g ...) বা প্রয়োজনীয় মডিউলগুলি npm( dependenciesএখানে তালিকাভুক্ত : https://github.com/npm/npm/blob/master/package.json ) সন্ধানের গ্যারান্টিযুক্ত । আপনি যদি এনপিএম এর একটি নতুন সংস্করণ ব্যবহার করে থাকেন তবে এটি এখন বিশ্বব্যাপী ইনস্টল করা প্যাকেজগুলির নির্ভরতাগুলি খুঁজে পেতে পারে কারণ node_modulesএখন ফোল্ডারগুলির জন্য চাটুকার কাঠামো রয়েছে ।

আশা করি এটি কারও কাজে লাগবে।


19

অনুযায়ী ডকুমেন্টেশন , Node.js ডিফল্টরূপে নিম্নলিখিত স্থানগুলিতে অনুসন্ধান করবে:

  1. NODE_PATHএনভায়রনমেন্ট ভেরিয়েবলের মধ্যে নির্দিষ্ট পাথ

    দ্রষ্টব্য: NODE_PATHপরিবেশ পরিবর্তনশীল নিখুঁত পাথের কোলন-বিস্মৃত তালিকাতে সেট করা আছে।

  2. বর্তমান node_modulesফোল্ডার (স্থানীয়)

  3. $HOME/.node_modules (গ্লোবাল)

    দ্রষ্টব্য: $HOMEব্যবহারকারীর হোম ডিরেক্টরি।

  4. $HOME/.node_libraries (গ্লোবাল)
  5. $PREFIX/lib/node (গ্লোবাল)

    দ্রষ্টব্য: $PREFIXনোড.জেএস কনফিগার করা আছে node_prefix

    এর বর্তমান মানটি পরীক্ষা করতে node_prefix, চালান:

    node -p process.config.variables.node_prefix

    দ্রষ্টব্য: উপসর্গটি --prefixবিল্ড চলাকালীন প্যারামের সাথে সম্পর্কিত এবং এটি সম্পর্কিত process.execPathnpm config get prefixকমান্ড থেকে মান সঙ্গে বিভ্রান্ত না । উৎস

যদি প্রদত্ত মডিউলটি খুঁজে পাওয়া যায় না, তার অর্থ এটি উপরের কোনও একটিতে উপস্থিত নেই।

গ্লোবাল রুট ফোল্ডারটির অবস্থান যেখানে মডিউলগুলি ইনস্টল করা আছে তা দ্বারা মুদ্রণ করা যেতে পারে: npm root -g(ডিফল্টরূপে npmrcফাইলটি ওভাররাইড না করা পর্যন্ত রান-টাইমে পাথটি গণনা করা হয় )।

সমাধান

আপনি নিম্নলিখিত workarounds চেষ্টা করতে পারেন:

  • NODE_PATHপরিবেশ পরিবর্তনশীল আপনার গ্লোবাল মডিউল অবস্থান নির্দিষ্ট করুন । যেমন

    echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node

    এর মান পরীক্ষা করতে এবং মুদ্রণ করতে NODE_PATH, চালান:

    echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 
  • আরও স্থায়ী সমাধানের জন্য, $HOME/.node_modulesএই কমান্ডটি চালিয়ে আপনার গ্লোবাল ব্যবহারকারী ফোল্ডারটিকে মূল ফোল্ডারে দেখানোর জন্য লিঙ্ক করুন :

    ln -vs "$(npm root -g)" "$HOME"/.node_modules

    তারপরে এটি পুনরায় পরীক্ষা করুন: echo 'require("forever")' | nodeকমান্ডের মাধ্যমে ।

  • স্ক্রিপ্টটি শুরু করার আগে বিশ্বব্যাপী যেখানে এক্সটেনশনটি ইনস্টল করা হয়েছে সেখানে অস্থায়ী পরিবর্তন করুন। যেমন

    npm install -g forever
    cd "$(npm root -g)"
    echo 'require("forever")' | node
    cd -
  • ব্যবহারকারী npmকনফিগ ফাইলে (দেখুন npm help 5 npmrc:) অথবা প্যারামের মাধ্যমে বিশ্বব্যাপী ইনস্টলেশন গন্তব্য কনফিগার করুন userconfig(--prefix )।

    বর্তমান কনফিগারেশন প্রদর্শন করতে, চালান: npm config list

    সম্পাদন করা বর্তমান কনফিগ, সঞ্চালন করুন: npm config edit

  • কল করার সময় নোড মডিউলগুলির পুরো পথ নির্দিষ্ট করুন require()। যেমন

    require("/path/to/sub/module")
  • প্যাকেজটি কাস্টম অবস্থানে ইনস্টল করুন, যেমন

    npm install forever -g --prefix "$HOME"/.node_modules

    যাইহোক, ইনস্টলেশনটি অধীনে যাবে ~/.node_modules/lib/node_modules/, সুতরাং এখনও অবস্থানটি যুক্ত করা দরকার।

    দেখুন: কাস্টম অবস্থানে এনপিএম স্থানীয় ইনস্টল প্যাকেজ

  • গ্লোবাল প্যাকেজটির অবস্থান থেকে বর্তমান ফোল্ডারে একটি সিমিলিংক তৈরি করুন । যেমন

    npm link forever

এটি 4 -র মতো দেখতে বর্তমান নোড_মডিউলগুলি ফোল্ডার। (স্থানীয়) 3 এর উপরে অগ্রাধিকার গ্রহণ করে $ প্রিফিক্স / লিবিব / নোড (গ্লোবাল)
কিরলি ইস্টভিয়ান

স্থানীয় নোড_মডিউল ফোল্ডার সর্বদা বিশ্বব্যাপী ফোল্ডারগুলির চেয়ে বেশি অগ্রাধিকার নেয়!
কিরলি ইস্তভিন

14

আপনি requiregএই সমস্যাটি সমাধান করতে প্যাকেজটি ব্যবহার করতে পারেন :

var forever = require('requireg')('forever')

কৌতুক করবে

এছাড়াও, আরও একটি মডিউল রয়েছে, global-npmযদিও কেবলমাত্র বিশ্বব্যাপী ব্যবহারের জন্য নির্দিষ্ট npm, আপনি শর্ট কোডটি দেখতে পারেন এবং কীভাবে কৌশলটি কাজ করে তা দেখতে পারেন।


আকর্ষণীয়, তবে NODE_PATH পদ্ধতিটি সম্ভবত আরও প্রচলিত
আলেকজান্ডার মিলস

এর সৌন্দর্যটিও NODE_PATHহ'ল, আপনাকে কোনও কোড পরিবর্তন করার দরকার নেই। (আমার ব্যবহারের ক্ষেত্রটি অনেকগুলি ছাত্র প্রকল্পকে গ্রেড করছে, যেখানে আমি npm installপ্রত্যেকটির জন্য দৌড়াতে চাই না এবং তাদের node_modulesডিরেক্টরি সরবরাহও চাই না ))
অ্যান্থেস

না, এটি কৌশলটি করবে না কারণ আপনার requiregপ্রথম স্থানে প্রয়োজন হতে পারে না , এটি পুরো বিষয়টি।
thisismydesign

6

CLI ইউটিলিটিগুলির জন্য যা বড় মডিউলগুলির উপর নির্ভর করে, যেমন puppeteerআমি একটি স্প্যান করতে চাই npm root -gএবং এটি বিশ্বব্যাপী মডিউলটির প্রয়োজনে ব্যবহার করতে চাই ।

try {
  const root = require('child_process').execSync('npm root -g').toString().trim()
  var puppeteer = require(root + '/puppeteer')
} catch (err) {
  console.error(`Install puppeteer globally first with: npm install -g puppeteer`)
  process.exit(1)
}

3

আপনি আপনার .profileফাইলটিতে এই লাইনটি রাখতে পারেন :

NODE_PATH = "$ (এনপিএম কনফিগারেশন উপসর্গ পেতে) / lib / নোড_মডিউলগুলি" রফতানি করুন

এটি nodeবিশ্বব্যাপী পথটি ব্যবহার করবে ।


1
এটি বিশ্বব্যাপী পাওয়ার সাধারণ উপায় node_modules। এটি একটি পুরানো উত্তর তবে আমি মনে করি ডকুমেন্টেশনে আমি এটি অন্য কোথাও থেকে পেয়েছি। যাই হোক, (2020 সালে) আমার কম্পিউটারে বিশ্বব্যাপী npm node_modulesডিরেক্টরি হয় usr/lib/node_modules। যাইহোক, আমি বিশ্বাস করি npm config get prefixকারণ এটি বিশ্বব্যাপী এনপিএম দ্বারা ব্যবহৃত হয় যখনই কোনও বিশ্বব্যাপী প্যাকেজ ইনস্টল করা হয় তাই এটি সঠিক হওয়া উচিত।
লুইস পাওলো

1
যেভাবেই হোক (আমি আমার প্রাথমিক উত্তরে এটি বলিনি কারণ আমি নোড.জেএস-তে খুব বেশি অভিজ্ঞ ছিলাম না), কোনও প্রোগ্রামে বিশ্বব্যাপী ইনস্টল করা প্যাকেজগুলি ব্যবহার করা একটি প্রান্ত ব্যবহারের ক্ষেত্রে এবং খুব কমই করা উচিত কারণ একটি প্রকল্পে এটি তৈরি করবে সমস্যার যখনই প্রকল্পের নির্দিষ্ট নির্ভরতা হচ্ছে না কারণে VCS করতে প্রতিশ্রুতিবদ্ধ এবং অন্য পরিবেশে ক্লোন করা হয় package.jsonফাইল বা yarn.lock/ package-lock.json
লুইস পাওলো

1
উহু! আমি এখন বুঝতে পেরেছি. আমি বিশ্বাস করি আপনি NATE_PATH কে PATH দিয়ে ভুল করছেন। PATH হল যেখানে শেল এক্সিকিউটেবলের সন্ধান করবে। NODE_PATH যেখানে নোড প্যাকেজগুলির সন্ধান করবে। এটি কোনও node_modulesফোল্ডারের জন্য বর্তমান ডিরেক্টরিটি দেখে শুরু হবে , তারপরে এটি পিতামাতার, তারপরে পিতামাতার ... ... যতক্ষণ না এটি কোনও node_modulesমডিউল থাকা কোনও ফোল্ডার খুঁজে না পায় । তবে আপনি যদি বিশ্বজুড়ে কোনও প্যাকেজ ইনস্টল করেন তবে node_modulesএটি স্ক্রিপ্টের বর্তমান ডিরেক্টরিটির উপরে থাকা কোনও ফোল্ডারের অভ্যন্তরে থাকবে না যাতে আপনি NODE_PATH কে ফ্যালব্যাক হিসাবে ব্যবহার করেন যেখানে নোড প্যাকেজগুলি সন্ধান করবে।
লুইস পাওলো

1
আহাহাহাহ @ লুইস পাওলো আপনি পুরোপুরি ঠিক বলেছেন !! আমি দুঃখিত! আমি চেষ্টা করব এবং বিভ্রান্তি রোধ করতে আমার কিছু মন্তব্য মুছে ফেলব, সুন্দর কাজ এবং ধন্যবাদ
রায়ান টেলর

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