নেস্টেড ফোল্ডারগুলির জন্য এনপিএম ইনস্টল চালানোর সর্বোত্তম উপায়?


128

npm packagesনেস্টেড সাব ফোল্ডারগুলিতে ইনস্টল করার সবচেয়ে সঠিক উপায় কী ?

my-app
  /my-sub-module
  package.json
package.json

সবচেয়ে ভালো উপায় আছে কী packagesমধ্যে /my-sub-moduleযখন স্বয়ংক্রিয়ভাবে ইনস্টল করা npm installচালানোর my-app?


আমি মনে করি যে সবচেয়ে প্রচ্ছন্ন বিষয় হ'ল আপনার প্রকল্পের একা একক প্যাকেজ.জসন ফাইল থাকা।
রবার্ট মোসকাল

একটি ধারণাটি হ'ল এনপিএম স্ক্রিপ্ট ব্যবহার করা যা ব্যাশ ফাইল চালায়।
ডেভিন ট্রায়ন

স্থানীয় পথগুলি কীভাবে কাজ করে তার পরিবর্তনের সাথে এটি করা যায় না ?: stackoverflow.com/questions/14381898/…
ইভানস

উত্তর:


26

যদি আপনি নেস্টেড সাবফোল্ডারগুলিতে এনপিএম প্যাকেজ ইনস্টল করতে একটি একক কমান্ড চালাতে চান তবে আপনি আপনার মূল ডিরেক্টরিতে একটি npmমূল স্ক্রিপ্ট চালাতে পারেন package.json। স্ক্রিপ্ট প্রতিটি উপ-ডিরেক্টরি এবং পরিদর্শন করবে npm install

নীচে একটি .jsস্ক্রিপ্ট যা পছন্দসই ফলাফল অর্জন করবে:

var fs = require('fs')
var resolve = require('path').resolve
var join = require('path').join
var cp = require('child_process')
var os = require('os')

// get library path
var lib = resolve(__dirname, '../lib/')

fs.readdirSync(lib)
  .forEach(function (mod) {
    var modPath = join(lib, mod)
// ensure path has package.json
if (!fs.existsSync(join(modPath, 'package.json'))) return

// npm binary based on OS
var npmCmd = os.platform().startsWith('win') ? 'npm.cmd' : 'npm'

// install folder
cp.spawn(npmCmd, ['i'], { env: process.env, cwd: modPath, stdio: 'inherit' })
})

দ্রষ্টব্য যে এটি স্ট্রংলুপ নিবন্ধ থেকে নেওয়া একটি উদাহরণ যা বিশেষভাবে একটি মডুলার node.jsপ্রকল্প কাঠামোকে সম্বোধন করে (নেস্টেড উপাদান এবং package.jsonফাইলগুলি সহ )।

প্রস্তাবিত হিসাবে, আপনি বাশ স্ক্রিপ্ট দিয়ে একই জিনিস অর্জন করতে পারে।

সম্পাদনা: উইন্ডোজ কোড কোড তৈরি


1
জটিল যদিও, নিবন্ধ লিঙ্কের জন্য ধন্যবাদ।
WHITECOLOR

যদিও 'উপাদান' ভিত্তিক কাঠামোটি নোড অ্যাপ সেটআপ করার বেশ সহজ উপায়, তবে অ্যাপ্লিকেশনটির প্রারম্ভিক পর্যায়ে পৃথক প্যাকেজ.জসন ফাইলগুলি ছড়িয়ে দিতে সম্ভবত এটি অতিরিক্ত দক্ষতা অর্জন করে the অ্যাপ্লিকেশনটি যখন বৃদ্ধি পায় তখন ধারণাটি সফল হয় and আপনি বৈধভাবে পৃথক মডিউল / পরিষেবা চান। তবে হ্যাঁ, প্রয়োজনীয় না হলে অবশ্যই জটিল।
স্নোজা

3
যদিও হ্যাঁ একটি বাশ স্ক্রিপ্টটি করবে তবে আমি উইন্ডোজ যে ডক্স শেল এবং লিনাক্স / ম্যাকের ইউনিক্স শেল রয়েছে তার মধ্যে সর্বাধিক বহনযোগ্যতার জন্য নোডেজ করার পদ্ধতিটিকে পছন্দ করি।
ট্রুথহোল্ডার

270

আমি পোস্ট-ইনস্টলটি ব্যবহার করতে পছন্দ করি, যদি আপনি নেস্টেড সাবডিরের নামগুলি জানেন। ইন package.json:

"scripts": {
  "postinstall": "cd nested_dir && npm install",
  ...
}

10
একাধিক ফোল্ডার সম্পর্কে কি? "সিডি নেস্টেড_ডির && এন্ড এনপিএল && সিডি .. & সিডি নেস্টেড_ডির 2 && এনপিএল ইনস্টল" ??
এমরে

1
@ সর্বদা হ্যাঁ - এটিই।
গাই

2
@ স্কট আপনি কি কেবলমাত্র পরবর্তী ফোল্ডারটি ভিতরে থাকা প্যাকেজটিতে রাখতে পারবেন না "postinstall": "cd nested_dir2 && npm install"? প্রতিটি ফোল্ডারের জন্য পছন্দ করুন ?
আরন

1
@ অ্যারন যদি আপনি নামের প্যারেন্ট ডিরেক্টরিতে দুটি সাব-ডাইরেক্টরি চান?
আলেক

28
@ সর্বদা এটির কাজ করা উচিত, সাবশেলগুলি কিছুটা পরিষ্কার হতে পারে: "(সিডি নেস্টেড_ডির & & এনপিএল ইনস্টল); (সিডি নেস্টেড_ডির ২ & & এনপিএল ইনস্টল); ..."
অ্যালেক

48

@ স্কট এর উত্তর অনুসারে, সাব-ডিরেক্টরি নাম জানা যায় ততক্ষণ ইনস্টল | পোস্টইনস্টল স্ক্রিপ্টটি সবচেয়ে সহজ উপায় আমি একাধিক সাব ডায়ারের জন্য এটি চালাই। উদাহরণস্বরূপ, সাজা আমরা আছে api/, web/এবং shared/একটি monorepo root- র মধ্যে উপ-প্রকল্প:

// In monorepo root package.json
{
...
 "scripts": {
    "postinstall": "(cd api && npm install); (cd web && npm install); (cd shared && npm install)"
  },
}

1
নিখুঁত সমাধান. ভাগ করে নেওয়ার জন্য ধন্যবাদ :-)
রাহুল সোনি

1
উত্তর করার জন্য ধন্যবাদ. আমার জন্য কাজ করছি।
AMIC MIN

4
( )সাবস্কেলগুলি তৈরি এবং এড়ানো এড়াতে ভাল ব্যবহার cd api && npm install && cd ..
ক্যামেরন হাডসন

4
এটি নির্বাচিত উত্তর হওয়া উচিত!
tmos

3
npm installশীর্ষ-স্তরে চলার সময় আমি এই ত্রুটিটি "(cd was unexpected at this time."
পেয়েছি

22

আমার সমাধান খুব অনুরূপ। খাঁটি নোড.জেএস

নিম্নলিখিত লিপিটি সমস্ত সাবফোল্ডারগুলি (পুনরাবৃত্তভাবে) যতক্ষণ না তাদের পরীক্ষা করে package.jsonএবং সেগুলির npm installপ্রতিটিতে চালিত হয়। এটির সাথে ব্যতিক্রমগুলি যুক্ত করতে পারেন: ফোল্ডারগুলির না থাকার অনুমতি রয়েছে package.json। নীচের উদাহরণে এই জাতীয় ফোল্ডারটি হ'ল "প্যাকেজগুলি"। এটি একটি "প্রিনস্টল" স্ক্রিপ্ট হিসাবে চালাতে পারে।

const path = require('path')
const fs = require('fs')
const child_process = require('child_process')

const root = process.cwd()
npm_install_recursive(root)

// Since this script is intended to be run as a "preinstall" command,
// it will do `npm install` automatically inside the root folder in the end.
console.log('===================================================================')
console.log(`Performing "npm install" inside root folder`)
console.log('===================================================================')

// Recurses into a folder
function npm_install_recursive(folder)
{
    const has_package_json = fs.existsSync(path.join(folder, 'package.json'))

    // Abort if there's no `package.json` in this folder and it's not a "packages" folder
    if (!has_package_json && path.basename(folder) !== 'packages')
    {
        return
    }

    // If there is `package.json` in this folder then perform `npm install`.
    //
    // Since this script is intended to be run as a "preinstall" command,
    // skip the root folder, because it will be `npm install`ed in the end.
    // Hence the `folder !== root` condition.
    //
    if (has_package_json && folder !== root)
    {
        console.log('===================================================================')
        console.log(`Performing "npm install" inside ${folder === root ? 'root folder' : './' + path.relative(root, folder)}`)
        console.log('===================================================================')

        npm_install(folder)
    }

    // Recurse into subfolders
    for (let subfolder of subfolders(folder))
    {
        npm_install_recursive(subfolder)
    }
}

// Performs `npm install`
function npm_install(where)
{
    child_process.execSync('npm install', { cwd: where, env: process.env, stdio: 'inherit' })
}

// Lists subfolders in a folder
function subfolders(folder)
{
    return fs.readdirSync(folder)
        .filter(subfolder => fs.statSync(path.join(folder, subfolder)).isDirectory())
        .filter(subfolder => subfolder !== 'node_modules' && subfolder[0] !== '.')
        .map(subfolder => path.join(folder, subfolder))
}

3
আপনার স্ক্রিপ্ট সুন্দর। যাইহোক, আমার ব্যক্তিগত উদ্দেশ্যে আমি গভীর 'বাসিন্দা' এনপিএম ইনস্টল 'পেতে প্রথম' যদি শর্ত 'অপসারণ করতে পছন্দ করি!
গিলহেরমে কারাসিওলো

21

লোকেরা যদি এই প্রশ্নটি আসে কেবল রেফারেন্সের জন্য। এখন তুমি পারো:

  • একটি প্যাকেজ.জসন একটি সাবফোল্ডারে যুক্ত করুন
  • মূল প্যাকেজ.জসনে রেফারেন্স-লিঙ্ক হিসাবে এই সাবফোল্ডারটি ইনস্টল করুন:

npm install --save path/to/my/subfolder


2
লক্ষ্য করুন যে নির্ভরতাগুলি মূল ফোল্ডারে ইনস্টল করা আছে। আমি সন্দেহ করি যে আপনি যদি এই প্যাটার্নটি বিবেচনাও করেন তবে আপনি সাব-ডিরেক্টরিতে সাব-ডিরেক্টরি প্যাকেজ.জসনের নির্ভরতা চান।
কোডি অ্যালান টেলর

আপনি কি বোঝাতে চেয়েছেন? সাবফোল্ডার-প্যাকেজের জন্য নির্ভরতা সাবফোল্ডারে প্যাকেজ.জসনে রয়েছে।
জেলমার জেল্লেমা

(এনপিএম v6.6.0 এবং নোড v8.15.0 ব্যবহার করে) - নিজের জন্য একটি উদাহরণ স্থাপন করুন। mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;এখন অপেক্ষা করুন ... আপনি "খ"-তে ম্যানুয়ালি নির্ভরতা ইনস্টল করেছেন, আপনি নতুন প্রকল্পটি ক্লোন করলে তা হয় না। rm -rf node_modules ; cd .. ; npm install --save ./b। এখন নোড_মডিউলগুলি তালিকাবদ্ধ করুন, তারপরে তালিকাভুক্ত খ।
কোডি অ্যালান টেলর

1
আহ আপনি মডিউল মানে। হ্যাঁ, খ এর জন্য নোড_মডিউলগুলি একটি / নোড_মডিউলগুলিতে ইনস্টল করা হবে। যা বোঝায়, কারণ আপনার "মূল" নোড মডিউল হিসাবে নয়, মূল কোডের অংশ হিসাবে মডিউলগুলি প্রয়োজন / অন্তর্ভুক্ত করা হবে। সুতরাং একটি "প্রয়োজনীয় ('থ্রোগ 2')" একটি / নোড_মডিউলগুলিতে 2 মাধ্যমে অনুসন্ধান করবে।
জেলমার জেল্লেমা 21'19

আমি কোড উত্পন্ন করার চেষ্টা করছি এবং একটি সাবফোল্ডার-প্যাকেজ চাই যা তার নিজস্ব নোড_মডিউলগুলি সহ চালানোর জন্য সম্পূর্ণ প্রস্তুত। আমি যদি সমাধানটি খুঁজে পাই তবে আমি আপডেটটি নিশ্চিত করব!
আহসুলি

19

কেস 1 ব্যবহার করুন : আপনি যদি প্রতিটি উপ-ডিরেক্টরিতে (যেখানে প্রতিটি প্যাকেজ.জসন রয়েছে) থেকে এনপিএম কমান্ডগুলি চালাতে সক্ষম হন তবে আপনাকে ব্যবহার করতে হবে postinstall

যেহেতু আমি প্রায়শই npm-run-allযেভাবেই ব্যবহার করি, আমি এটি এটিকে সুন্দর এবং সংক্ষিপ্ত রাখার জন্য ব্যবহার করি (পোস্টইনস্টলের অংশ):

{
    "install:demo": "cd projects/demo && npm install",
    "install:design": "cd projects/design && npm install",
    "install:utils": "cd projects/utils && npm install",

    "postinstall": "run-p install:*"
}

এর অতিরিক্ত সুবিধা রয়েছে যা আমি একবারে বা স্বতন্ত্রভাবে ইনস্টল করতে পারি। আপনার যদি npm-run-allএটির প্রয়োজন না হয় বা নির্ভরতা হিসাবে না চান তবে ডেমিম্যাক্সের উত্তরটি দেখুন (পোস্টইনস্টলটিতে সাবসেল ব্যবহার করে)।

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

npm install path/to/any/directory/with/a/package-json

পরবর্তী ক্ষেত্রে, আপনি উপ-ডিরেক্টরিগুলিতে কোনও node_modulesবা package-lock.jsonফাইল খুঁজে না পেয়ে অবাক হবেন না - সমস্ত প্যাকেজগুলি রুটে ইনস্টল করা হবে node_modules, যার কারণে আপনি আপনার এনপিএম কমান্ডগুলি চালাতে সক্ষম হবেন না (যেটি আপনার যে কোনও উপ-ডিরেক্টরি থেকে নির্ভরতা প্রয়োজন) depend

আপনি যদি নিশ্চিত না হন তবে 1 কেস সর্বদা কার্যকর হয়।


প্রতিটি সাবমোডিয়ুলের নিজস্ব ইনস্টল স্ক্রিপ্ট থাকা এবং তারপরে সেগুলি পোস্টিনস্টল-এ কার্যকর করা ভাল nice run-pপ্রয়োজনীয় নয়, তবে এটি আরও ভার্বোস"postinstall": "npm run install:a && npm run install:b"
কিওয়ার্টি

হ্যাঁ, আপনি &&ছাড়া ব্যবহার করতে পারেন run-p। তবে আপনি যেমন বলেছিলেন তা কম পঠনযোগ্য। আরেকটি অসুবিধা (যে রান-পি সমাধান করে যে সমান্তরালভাবে ইনস্টলগুলি চালিত হয়) এটি হ'ল যদি কোনও ব্যর্থ হয় তবে অন্য কোনও স্ক্রিপ্ট প্রভাবিত হয় না
ডন ভন

3

স্নোজার উত্তরগুলিতে উইন্ডোজ সমর্থন যুক্ত করার পাশাপাশি node_modulesউপস্থিত থাকলে ফোল্ডারটি এড়িয়ে যাওয়া ।

var fs = require('fs')
var resolve = require('path').resolve
var join = require('path').join
var cp = require('child_process')

// get library path
var lib = resolve(__dirname, '../lib/')

fs.readdirSync(lib)
  .forEach(function (mod) {
    var modPath = join(lib, mod)
    // ensure path has package.json
    if (!mod === 'node_modules' && !fs.existsSync(join(modPath, 'package.json'))) return

    // Determine OS and set command accordingly
    const cmd = /^win/.test(process.platform) ? 'npm.cmd' : 'npm';

    // install folder
    cp.spawn(cmd, ['i'], { env: process.env, cwd: modPath, stdio: 'inherit' })
})

আপনি অবশ্যই পারবেন। নোড_মডিউলস ফোল্ডারটি এড়িয়ে যাওয়ার জন্য আমি আমার সমাধানটি আপডেট করেছি।
ঘোস্ট্রিডার

2

এখানে সরবরাহিত স্ক্রিপ্টগুলি দ্বারা অনুপ্রাণিত হয়ে আমি একটি কনফিগারযোগ্য উদাহরণ তৈরি করেছি যা:

  • ব্যবহার করতে সেটআপ করা যেতে পারে yarnবাnpm
  • লক ফাইলের উপর ভিত্তি করে কমান্ডটি নির্ধারণের জন্য সেটআপ করা যেতে পারে যাতে আপনি এটি ব্যবহার করতে সেট করেন yarnতবে একটি ডিরেক্টরিতে কেবল এটি থাকে সেই ডিরেক্টরিতে package-lock.jsonএটি ব্যবহার করা হবে npm(সত্য সত্যই ডিফল্ট)।
  • লগিং কনফিগার করুন
  • সমান্তরাল ব্যবহার করে ইনস্টলেশন চালায় cp.spawn
  • এটি প্রথমে কী করবে তা আপনাকে দেখতে শুকনো রান করতে পারে
  • env vars ব্যবহার করে একটি ফাংশন বা অটো চালানো হিসাবে চালানো যেতে পারে
    • যখন একটি ফাংশন হিসাবে চালানো হয়, চেক করার জন্য directoriesচ্ছিকভাবে ডিরেক্টরিগুলির অ্যারে সরবরাহ করুন
  • সম্পন্ন হলে সমাধান হয় এমন প্রতিশ্রুতি দেয়
  • প্রয়োজনে সর্বাধিক গভীরতা নির্ধারণ করার অনুমতি দেয়
  • yarn workspaces(কনফিগারযোগ্য) সহ কোনও ফোল্ডার পেলে পুনরাবৃত্তি বন্ধ করতে জানে
  • কমা দ্বারা বিচ্ছিন্ন এনভ ভার ব্যবহার করে বা কনফিগার দিয়ে স্ট্রিংগুলির একটি অ্যারের সাথে মেলে এমন ফাইলের নাম, ফাইলের পাথ এবং fs.Dirent আপত্তি প্রাপ্ত করে এবং বুলিয়ান ফলাফল প্রত্যাশা করে ডিরেক্টরিগুলি এড়িয়ে যাওয়ার অনুমতি দেয়।
const path = require('path');
const { promises: fs } = require('fs');
const cp = require('child_process');

// if you want to have it automatically run based upon
// process.cwd()
const AUTO_RUN = Boolean(process.env.RI_AUTO_RUN);

/**
 * Creates a config object from environment variables which can then be
 * overriden if executing via its exported function (config as second arg)
 */
const getConfig = (config = {}) => ({
  // we want to use yarn by default but RI_USE_YARN=false will
  // use npm instead
  useYarn: process.env.RI_USE_YARN !== 'false',
  // should we handle yarn workspaces?  if this is true (default)
  // then we will stop recursing if a package.json has the "workspaces"
  // property and we will allow `yarn` to do its thing.
  yarnWorkspaces: process.env.RI_YARN_WORKSPACES !== 'false',
  // if truthy, will run extra checks to see if there is a package-lock.json
  // or yarn.lock file in a given directory and use that installer if so.
  detectLockFiles: process.env.RI_DETECT_LOCK_FILES !== 'false',
  // what kind of logging should be done on the spawned processes?
  // if this exists and it is not errors it will log everything
  // otherwise it will only log stderr and spawn errors
  log: process.env.RI_LOG || 'errors',
  // max depth to recurse?
  maxDepth: process.env.RI_MAX_DEPTH || Infinity,
  // do not install at the root directory?
  ignoreRoot: Boolean(process.env.RI_IGNORE_ROOT),
  // an array (or comma separated string for env var) of directories
  // to skip while recursing. if array, can pass functions which
  // return a boolean after receiving the dir path and fs.Dirent args
  // @see https://nodejs.org/api/fs.html#fs_class_fs_dirent
  skipDirectories: process.env.RI_SKIP_DIRS
    ? process.env.RI_SKIP_DIRS.split(',').map(str => str.trim())
    : undefined,
  // just run through and log the actions that would be taken?
  dry: Boolean(process.env.RI_DRY_RUN),
  ...config
});

function handleSpawnedProcess(dir, log, proc) {
  return new Promise((resolve, reject) => {
    proc.on('error', error => {
      console.log(`
----------------
  [RI] | [ERROR] | Failed to Spawn Process
  - Path:   ${dir}
  - Reason: ${error.message}
----------------
  `);
      reject(error);
    });

    if (log) {
      proc.stderr.on('data', data => {
        console.error(`[RI] | [${dir}] | ${data}`);
      });
    }

    if (log && log !== 'errors') {
      proc.stdout.on('data', data => {
        console.log(`[RI] | [${dir}] | ${data}`);
      });
    }

    proc.on('close', code => {
      if (log && log !== 'errors') {
        console.log(`
----------------
  [RI] | [COMPLETE] | Spawned Process Closed
  - Path: ${dir}
  - Code: ${code}
----------------
        `);
      }
      if (code === 0) {
        resolve();
      } else {
        reject(
          new Error(
            `[RI] | [ERROR] | [${dir}] | failed to install with exit code ${code}`
          )
        );
      }
    });
  });
}

async function recurseDirectory(rootDir, config) {
  const {
    useYarn,
    yarnWorkspaces,
    detectLockFiles,
    log,
    maxDepth,
    ignoreRoot,
    skipDirectories,
    dry
  } = config;

  const installPromises = [];

  function install(cmd, folder, relativeDir) {
    const proc = cp.spawn(cmd, ['install'], {
      cwd: folder,
      env: process.env
    });
    installPromises.push(handleSpawnedProcess(relativeDir, log, proc));
  }

  function shouldSkipFile(filePath, file) {
    if (!file.isDirectory() || file.name === 'node_modules') {
      return true;
    }
    if (!skipDirectories) {
      return false;
    }
    return skipDirectories.some(check =>
      typeof check === 'function' ? check(filePath, file) : check === file.name
    );
  }

  async function getInstallCommand(folder) {
    let cmd = useYarn ? 'yarn' : 'npm';
    if (detectLockFiles) {
      const [hasYarnLock, hasPackageLock] = await Promise.all([
        fs
          .readFile(path.join(folder, 'yarn.lock'))
          .then(() => true)
          .catch(() => false),
        fs
          .readFile(path.join(folder, 'package-lock.json'))
          .then(() => true)
          .catch(() => false)
      ]);
      if (cmd === 'yarn' && !hasYarnLock && hasPackageLock) {
        cmd = 'npm';
      } else if (cmd === 'npm' && !hasPackageLock && hasYarnLock) {
        cmd = 'yarn';
      }
    }
    return cmd;
  }

  async function installRecursively(folder, depth = 0) {
    if (dry || (log && log !== 'errors')) {
      console.log('[RI] | Check Directory --> ', folder);
    }

    let pkg;

    if (folder !== rootDir || !ignoreRoot) {
      try {
        // Check if package.json exists, if it doesnt this will error and move on
        pkg = JSON.parse(await fs.readFile(path.join(folder, 'package.json')));
        // get the command that we should use.  if lock checking is enabled it will
        // also determine what installer to use based on the available lock files
        const cmd = await getInstallCommand(folder);
        const relativeDir = `${path.basename(rootDir)} -> ./${path.relative(
          rootDir,
          folder
        )}`;
        if (dry || (log && log !== 'errors')) {
          console.log(
            `[RI] | Performing (${cmd} install) at path "${relativeDir}"`
          );
        }
        if (!dry) {
          install(cmd, folder, relativeDir);
        }
      } catch {
        // do nothing when error caught as it simply indicates package.json likely doesnt
        // exist.
      }
    }

    if (
      depth >= maxDepth ||
      (pkg && useYarn && yarnWorkspaces && pkg.workspaces)
    ) {
      // if we have reached maxDepth or if our package.json in the current directory
      // contains yarn workspaces then we use yarn for installing then this is the last
      // directory we will attempt to install.
      return;
    }

    const files = await fs.readdir(folder, { withFileTypes: true });

    return Promise.all(
      files.map(file => {
        const filePath = path.join(folder, file.name);
        return shouldSkipFile(filePath, file)
          ? undefined
          : installRecursively(filePath, depth + 1);
      })
    );
  }

  await installRecursively(rootDir);
  await Promise.all(installPromises);
}

async function startRecursiveInstall(directories, _config) {
  const config = getConfig(_config);
  const promise = Array.isArray(directories)
    ? Promise.all(directories.map(rootDir => recurseDirectory(rootDir, config)))
    : recurseDirectory(directories, config);
  await promise;
}

if (AUTO_RUN) {
  startRecursiveInstall(process.cwd());
}

module.exports = startRecursiveInstall;

এবং এটি ব্যবহার করা হচ্ছে:

const installRecursively = require('./recursive-install');

installRecursively(process.cwd(), { dry: true })

1

findআপনার সিস্টেমে যদি আপনার ইউটিলিটি থাকে তবে আপনি নিজের অ্যাপ্লিকেশন রুট ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালনার চেষ্টা করতে পারেন:
find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;

মূলত, সমস্ত package.jsonফাইল সন্ধান করুন এবং npm installসমস্ত node_modulesডিরেক্টরি বাদ দিয়ে সেই ডিরেক্টরিতে চালান ।


1
দুর্দান্ত উত্তর। কেবলমাত্র একটি নোট যা আপনি এর সাথে অতিরিক্ত পাথগুলি বাদ দিতে পারেন:find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;
ইভান মুরান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.