আমি কি জাভাস্ক্রিপ্ট থেকে নোড.জেএস থেকে এনপিএম প্যাকেজ ইনস্টল করতে পারি?


94

আমি কি নোড.জেএস এ চলমান জাভাস্ক্রিপ্ট ফাইল থেকে একটি এনপিএম প্যাকেজ ইনস্টল করতে পারি? উদাহরণস্বরূপ, আমি একটি স্ক্রিপ্ট রাখতে চাই, আসুন এটি "স্ক্রিপ্ট.জেএস" বলুন যে কোনওভাবে (... এনপিএম ব্যবহার করছে বা না ...) সাধারণত এনপিএমের মাধ্যমে উপলব্ধ একটি প্যাকেজ ইনস্টল করুন। এই উদাহরণে, আমি "এফএফআই" ইনস্টল করতে চাই। (এনপিএম ইনস্টল এফফি)

উত্তর:


114

প্রোগ্রামটিমে এনপিএম ব্যবহার করা সত্যিই সম্ভব এবং এটি ডকুমেন্টেশনের পুরানো সংশোধনীগুলিতে রূপরেখা ছিল। এটি এর পরে সরকারী দস্তাবেজ থেকে সরানো হয়েছে, তবে নিম্নলিখিত বিবৃতি সহ উত্স নিয়ন্ত্রণে এখনও রয়েছে:

যদিও এনপিএম প্রোগ্রামযুক্তভাবে ব্যবহার করা যায়, তবে এর এপিআই কেবলমাত্র সিএলআই দ্বারা ব্যবহারের জন্য, এবং অন্য কোনও উদ্দেশ্যে এর ফিটনেস সম্পর্কিত কোনও গ্যারান্টি নেই। যদি আপনি নির্ভরযোগ্যভাবে কোনও কাজ সম্পাদন করতে এনপিএম ব্যবহার করতে চান, তবে সবচেয়ে নিরাপদ কাজটি হ'ল উপযুক্ত আর্গুমেন্ট সহ পছন্দসই এনপিএম কমান্ডটি চাওয়া।

এনপিএমের শব্দার্থক সংস্করণটি অন্তর্নিহিত এপিআইয়ের পরিবর্তে সিএলআইকেই বোঝায়। এনএমপি-র সংস্করণ ইঙ্গিত দেয় যে সেমভার অনুসারে কোনও ব্রেকিং পরিবর্তন হয়নি

মূল ডকুমেন্টেশনে, নিম্নলিখিতটি কোডের নমুনা সরবরাহ করা হয়েছিল:

var npm = require('npm')
npm.load(myConfigObject, function (er) {
  if (er) return handlError(er)
  npm.commands.install(['some', 'args'], function (er, data) {
    if (er) return commandFailed(er)
    // command succeeded, and data might have some info
  })
  npm.registry.log.on('log', function (message) { ... })
})

যেহেতু এনপিএমnode_modules ফোল্ডারে বিদ্যমান , আপনি require('npm')এটি অন্য মডিউলের মতো লোড করতে ব্যবহার করতে পারেন । একটি মডিউল ইনস্টল করতে, আপনি ব্যবহার করতে চাইবেন npm.commands.install()

যদি আপনার উত্সটি সন্ধান করতে হয় তবে এটি গিটহাবটিতেও রয়েছে । এখানে কোডের একটি সম্পূর্ণ কার্যকারী উদাহরণ, যা npm installকোনও কমান্ড-লাইন আর্গুমেন্ট ছাড়াই চলার সমতুল্য :

var npm = require('npm');
npm.load(function(err) {
  // handle errors

  // install module ffi
  npm.commands.install(['ffi'], function(er, data) {
    // log errors or data
  });

  npm.on('log', function(message) {
    // log installation progress
    console.log(message);
  });
});

নোট করুন যে ইনস্টল ফাংশনের প্রথম যুক্তিটি একটি অ্যারে is অ্যারের প্রতিটি উপাদান এমন একটি মডিউল যা এনএমপি ইনস্টল করার চেষ্টা করবে।

npm-cli.jsউত্স নিয়ন্ত্রণে ফাইলটিতে আরও উন্নত ব্যবহারের সন্ধান পাওয়া যায় ।


4
যদি এটি কাউকে সহায়তা করে - আপনি npm install npm --saveপ্রথমে নিশ্চিত হন তা নিশ্চিত করুন । উদাহরণ দুর্দান্ত কাজ করে :)
মিকর্ম্কনিল

6
এছাড়াও, সাবধান---- npmপ্রচুর নির্ভরতা রয়েছে, সুতরাং এটি আপনার মডিউলে যুক্ত করার ফলে সম্ভবত এটি ডাউনলোড হতে অনেক বেশি সময় নেয়। child_processইতিমধ্যে আপনার ব্যবহারকারীর মেশিনে ইনস্টল করা গ্লোবাল এনপিএম উত্তোলনের উত্তরগুলির মধ্যে একটি দেখুন ।
মিকর্ম্কনিল

4
পাস npm.configনা npm.load! এমনকি @ আইসাকসও জানেন না যে তখন কী ধরণের অদ্ভুত জিনিস হবে! দেখুন github.com/npm/npm/issues/4861#issuecomment-40533836 পরিবর্তে, আপনি শুধু 1 ম যুক্তি উপেক্ষা করতে পারেন।
জর্জি Ivankin

4
আমি কীভাবে গন্তব্যের পথ নির্ধারণ করব? (যখন এটি আলাদা হয় process.cwd())
গজুস

4
সতর্কতা থাকা সত্ত্বেও যারা এনপিএম আমদানি করতে চান তাদের জন্য গ্লোবাল-এনপিএম ভাল (ছোট, কোনও নির্ভরতা নেই)npm install npm --save
সুনামিয়াস

29

আপনি চাইল্ড_প্রসেস ব্যবহার করতে পারেন । Exec বা execSync ডিম করার জন্য একটি শেল তারপর যে শেল মধ্যে পছন্দসই কমান্ড সঞ্চালন করুন কোন উত্পন্ন আউটপুট বাফার উপলব্ধ:

var child_process = require('child_process');
child_process.execSync('npm install ffi',{stdio:[0,1,2]});

যদি একটি কলব্যাক ফাংশন সরবরাহ করা হয় তবে এটি আর্গুমেন্টগুলি (ত্রুটি, স্টাডআউট, স্টডার) সহ কল ​​করা হয়। আপনি ম্যানুয়ালি করার মতো আপনি ইনস্টলেশনটি চালাতে পারেন এবং পুরো আউটপুট দেখতে পারেন।

চাইল্ড_প্রসেস.এক্সেকসিঙ্ক () পদ্ধতিটি সাধারণত সন্তানের_প্রসেস.এক্সেক () এর সাথে সমান একটি ব্যতিক্রম ব্যতীত যে শিশু প্রক্রিয়া পুরোপুরি বন্ধ না হওয়া অবধি পদ্ধতিটি ফিরে আসবে না।


4
সমস্ত উত্তরগুলির মধ্যে এটিই একমাত্র বিকল্প যা উদাহরণস্বরূপ আপনাকে এনপিএম ইনস্টল চালাতে দেয় এবং পুরো আউটপুটটি পেতে দেয় যেন আপনি নিজেই কমান্ডটি চালাচ্ছেন! ধন্যবাদ!
জার্ন বার্কেফেল্ড

4
কি করে stdio: [0,1,2]?
জাচ স্মিথ

যদি একটি কলব্যাক ফাংশন চাইল্ড_প্রসেস.এক্সেক সরবরাহ করা হয়, তবে এপিআই ডক
ক্র্যাঙ্কুবা

26

হ্যাঁ. সিস্টেম কমান্ড কার্যকর করতে আপনি চাইল্ড_প্রসেস ব্যবহার করতে পারেন

var exec = require('child_process').exec,
    child;

 child = exec('npm install ffi',
 function (error, stdout, stderr) {
     console.log('stdout: ' + stdout);
     console.log('stderr: ' + stderr);
     if (error !== null) {
          console.log('exec error: ' + error);
     }
 });

4
হ্যাঁ, তবে আপনি কিছু নির্ভরতা ইনস্টল করতে ব্যর্থ হবেন (অভিজ্ঞতা থেকে কথা বলছেন, কারণ একসময় আমি আসলে নোড.জেএস জন্য একটি সিআই সার্ভার লিখেছিলাম )
মেটেজ

4
উইন্ডোজ এ কাজ করে না! npm.cmdপরিবর্তে আপনাকে কল করতে হবে।
DUzun

11

এটি আসলে কিছুটা সহজ হতে পারে

var exec = require('child_process').exec;
child = exec('npm install ffi').stderr.pipe(process.stderr);

4
এটিরও সুবিধা রয়েছে যে স্ট্যাডার (এবং স্টাডআউট) প্রিন্ট হওয়ার সাথে সাথে তা কার্যকর হয়, মৃত্যুদণ্ডের শেষে নয়!
mvermand

4
এটি নীচে @ ক্র্যাঙ্কুবা থেকে উত্তর হিসাবে একই পরিমাণে মুদ্রণযোগ্য নয়, যতদূর আমি বলতে পারি।
জাচ স্মিথ

6

আমার কাছে প্রকল্পের ডিরেক্টরিতে কাজ করার প্রথম উদাহরণ পাওয়ার চেষ্টা করার সময় হেক ছিল, অন্য কেউ এটির সন্ধান পেলে এখানে পোস্ট করে। আমি যতদূর বলতে পারি, এনপিএম এখনও সরাসরি বোঝা হয়ে সূক্ষ্মভাবে কাজ করে, তবে এটি সিএলআই অনুমান করে, আমাদের এটি স্থাপনের জন্য আমাদের নিজেকে পুনরাবৃত্তি করতে হবে:

// this must come before load to set your project directory
var previous = process.cwd();
process.chdir(project);

// this is the part missing from the example above
var conf = {'bin-links': false, verbose: true, prefix: project}

// this is all mostly the same

var cli = require('npm');
cli.load(conf, (err) => {
    // handle errors
    if(err) {
        return reject(err);
    }

    // install module
    cli.commands.install(['ffi'], (er, data) => {
        process.chdir(previous);
        if(err) {
            reject(err);
        }
        // log errors or data
        resolve(data);
    });

    cli.on('log', (message) => {
        // log installation progress
        console.log(message);
    });
});


2

আমি এমন একটি মডিউলটির লেখক যা আপনার মনে যা আছে ঠিক তা করার অনুমতি দেয়। দেখুন লাইভ-প্লাগইন-ব্যবস্থাপক

আপনি এনপিএম, গিথুব বা কোনও ফোল্ডার থেকে কার্যত যে কোনও প্যাকেজ ইনস্টল করতে এবং চালাতে পারেন।

এখানে একটি উদাহরণ:

import {PluginManager} from "live-plugin-manager";

const manager = new PluginManager();

async function run() {
  await manager.install("moment");

  const moment = manager.require("moment");
  console.log(moment().format());

  await manager.uninstall("moment");
}

run();

উপরের কোডে আমি momentরানটাইমের সময় প্যাকেজ ইনস্টল করি , এটি লোড করুন এবং সম্পাদন করুন। শেষে আমি এটি আনইনস্টল করব।

অভ্যন্তরীণভাবে আমি npmক্লিপ চালাচ্ছি না তবে প্রকৃতপক্ষে প্যাকেজগুলি ডাউনলোড করে একটি নোড ভিএম স্যান্ডবক্সের মধ্যে চলে run


1

@ হেক্সাসায়ানাইড দ্বারা দুর্দান্ত সমাধান, তবে এটি প্রমাণিত হয়েছে যে এনপিএম "লগ" ইভেন্টটি আর ছাড়ায় না (কমপক্ষে সংস্করণ 6.4.1 হিসাবে) of পরিবর্তে তারা একটি স্বতন্ত্র মডিউল https://github.com/npm/npmlog এ ভরসা করে । ভাগ্যক্রমে এটি একটি সিঙ্গলটন, তাই আমরা লগগুলির জন্য এনপিএম ব্যবহার করে এমন একই পরিস্থিতিতে পৌঁছে যেতে পারি এবং লগ ইভেন্টগুলির জন্য সাবস্ক্রাইব করতে পারি:

const npmlog = require( "npm/node_modules/npmlog" ),
      npm = require( "npm" );

npmlog.on( "log", msg => {
   console.log({ msg });
});

 process.on("time", milestone => {
   console.log({ milestone });
 });

 process.on("timeEnd", milestone => {
   console.log({ milestone });    
 });

 npm.load({
    loaded: false,
    progress: false,
    "no-audit": true
  }, ( err ) => {

 npm.commands.install( installDirectory, [
      "cross-env@^5.2.0",
      "shelljs@^0.8.2"
    ], ( err, data ) => {
       console.log( "done" );    
    });

  });

আপনি কোড থেকে দেখতে পাচ্ছেন, এনপিএম এছাড়াও এর উপর পারফরম্যান্স মেট্রিকগুলি নির্গত করে process, তাই আমরা এটিকে অগ্রগতি পর্যবেক্ষণ করতেও ব্যবহার করতে পারি।


1

আরেকটি বিকল্প, যা এখানে উল্লেখ করা হয়নি, তা হ'ল কাঁটাচামচ করা এবং সরাসরি সিএলআই চালানো ./node_modules/npm/bin/npm-cli.js

উদাহরণস্বরূপ আপনি মেশিনে স্ক্রিপ্ট চলমান থেকে নোড মডিউলগুলি ইনস্টল করতে সক্ষম হতে চান, যার এনপিএম ইনস্টল নেই। এবং আপনি সিএলআইয়ের সাথে এটি করতে চান না। এক্ষেত্রে আপনার প্রোগ্রামটি তৈরি করার সময় স্থানীয়ভাবে আপনার নোড_মডিউলগুলিতে এনপিএম ইনস্টল করুন npm i npm

তারপরে এটি ব্যবহার করুন:

// Require child_process module
const { fork } = require('child_process');
// Working directory for subprocess of installer
const cwd = './path-where-to-run-npm-command'; 
// CLI path FROM cwd path! Pay attention
// here - path should be FROM your cwd directory
// to your locally installed npm module
const cli = '../node_modules/npm/bin/npm-cli.js';
// NPM arguments to run with
// If your working directory already contains
// package.json file, then just install it!
const args = ['install']; // Or, i.e ['audit', 'fix']

// Run installer
const installer = fork(cli, args, {
  silent: true,
  cwd: cwd
});

// Monitor your installer STDOUT and STDERR
installer.stdout.on('data', (data) => {
  console.log(data);
});
installer.stderr.on('data', (data) => {
  console.log(data);
});

// Do something on installer exit
installer.on('exit', (code) => {
  console.log(`Installer process finished with code ${code}`);
});

তারপরে আপনার প্রোগ্রামটি বাইনারি ফাইলে এমনকি প্যাক করা যেতে পারে, উদাহরণস্বরূপ পিকেজি প্যাকেজ সহ। --ignore-scriptsএক্ষেত্রে আপনাকে এনপিএম বিকল্পটি ব্যবহার করা দরকার , কারণ প্রিনস্টল স্ক্রিপ্টগুলি চালানোর জন্য নোড-জিপ দরকার

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