نصب پکیج های npm به صورت محلی و سراسری

درسنامه درس 2 از سری آموزش npm
02-How-to-work-with-npm-beginners-guide

پکیج ها در npm

مدیریت پکیج ها در npm
مدیریت پکیج ها در npm

npm می تواند پکیج ها را به صورت local (محلی) یا global (سراسری) نصب کند. در حالت محلی پکیج ها در پوشه ی node_modules (یک پوشه قبل از مسیر اصلی کاری شما) نصب می شوند که متعلق به کاربر فعلی (user) است. در حالت سراسری پکیج ها در /prefix}/lib/node_modules} نصب می شوند که متعلق به root است (در این حالت {prefix} معمولا /usr/ یا /usr/local است).

بنابراین برای نصب پکیج ها به صورت سراسری باید از دستور sudo استفاده کنید که دو مشکل بالقوه دارد: اول آنکه ممکن است هنگام کار با وابستگی های دیگر باعث بروز خطای permission ها شود و دوم آنکه یک نگرانی امنیتی ایجاد کند. پس باید این مشکل را حل کنیم.

تغییر مسیر پکیج های سراسری (global)

ابتدا دستور npm config را وارد کنید. خروجی این دستور به شکل زیر است:

$ npm config list
; cli configs
user-agent = "npm/6.9.0 node/v10.15.3 linux x64"

; userconfig /home/sitepoint/.npmrc
prefix = "/home/sitepoint/.node_modules_global"

; node bin location = /usr/bin/nodejs
; cwd = /home/sitepoint
; HOME = /home/sitepoint
; "npm config ls -l" to show all defaults.

این خروجی اطلاعاتی راجع به عملیات نصب ما ارائه می کند. ما دنبال مکان فعلی نصب سراسری را پیدا کنیم:

$ npm config get prefix
/usr

این همان پیشوندی است که باید عوض کنیم تا بتوانیم پکیج ها را در دیرکتوری خودمان نصب کنیم. ابتدا یک دیرکتوری جدید در پوشه ی home خود بسازید:

$ cd ~ && mkdir .node_modules_global
$ npm config set prefix=$HOME/.node_modules_global

با همین تغییر کوچک در پیکربندی، مکان نصب پکیج های سراسری را تغییر داده ایم. این کار باعث ایجاد یک فایل npmrc. در پوشه ی home نیز می شود.

$ npm config get prefix
/home/sitepoint/.node_modules_global
$ cat .npmrc
prefix=/home/sitepoint/.node_modules_global

تا اینجای کار هنوز هم npm در مسیری نصب شده است که به root تعلق دارد اما از آنجا که مسیر نصب پکیج های سراسری را تغییر داده ایم می توانیم کاری برای این مورد نیز انجام بدهیم؛ باید npm را دوباره و این بار در مسیری که متعلق به user است، نصب کنیم. با این کار npm را نیز بروزرسانی کرده ایم.

npm install npm@latest -g

در آخر هم باید node_modules_global/bin. را به PATH$ در environment variable اضافه کنیم تا بتوانیم پکیج های سراسری را از طریق command line اجرا کنیم. برای این کار باید کد زیر را به profile. یا bash_profile. یا bashrc. اضافه کنید و سپس terminal خود را ریستارت کنید.

export PATH="$HOME/.node_modules_global/bin:$PATH"

حالا node_modules_global/bin. پیدا شده و از نسخه ی درست npm نیز استفاده می شود.

$ which npm
/home/sitepoint/.node_modules_global/bin/npm
$ npm --version
6.9.0

نصب پکیج ها در حالت سراسری (global)

ما در حال حاضر فقط یک پکیج را نصب داریم؛ خود پکیج npm. بنابراین باید پکیج های بیشتری نصب کنیم؛ برای مثال می خواهیم UglifyJS را نصب کنیم (ابزار فشرده سازی جاوا اسکریپت). ابتدا باید از global-- استفاده کنیم که حالت خلاصه اش g- است.

$ npm install uglify-js --global
/home/sitepoint/.node_modules_global/bin/uglifyjs -> /home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs
+ uglify-js@3.5.3
added 3 packages from 38 contributors in 3.282s

همانطور که از خروجی مشخص است، پکیج های دیگری هم همراه UglifyJS نصب شده اند. در واقع UglifyJS برای انجام کارهایش به آن ها نیاز دارد بنابراین به این پکیج ها dependency یا وابستگی می گوییم.

لیست کردن پکیج های سراسری (global)

برای مشاهده ی لیستی از پکیج های سراسری خود می توانید از دستور npm list استفاده کنید.

$ npm list --global
home/sitepoint/.node_modules_global/lib
├─┬ npm@6.9.0
│ ├── abbrev@1.1.1
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
│ ├── aproba@2.0.0
│ ├── archy@1.0.0
....................
└─┬ uglify-js@3.5.3
  ├── commander@2.19.0
  └── source-map@0.6.1

این خروجی پر از جزئیات به درد نخور است. اگر بخواهیم فقط لیست پکیج ها را ببینیم باید depth=0-- را نیز اضافه کنیم

$ npm list -g --depth=0
/home/sitepoint/.node_modules_global/lib
├── npm@6.9.0
└── uglify-js@3.5.3

حالا بهتر شد! فقط نام پکیج ها و نسخه ی نصب شده را به ما نشان می دهد. هر پکیجی که به صورت سراسری نصب شده باشد با این دستور قابل دسترسی است. به طور مثال اگر فایل جاوا اسکریپتی به نام example.js داشته باشیم و بخواهیم با استفاده از Uglify آن را فشرده و به example.min.js تبدیل کنیم باید دستور خود را به شکل زیر بنویسیم:

$ uglifyjs example.js -o example.min.js

نصب پکیج ها به صورت محلی (local)

زمانی که می خواهیم پکیج ها را به صورت محلی نصب کنیم معمولا از فایل package.json استفاده می کنیم. بنابراین باید یک فایل package.json ایجاد کنیم:

$ npm init
package name: (project)
version: (1.0.0)
description: Demo of package.json
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)

کلید Enter را بزنید تا این پیش فرض ها را قبول کنید و سپس با تایپ کردن yes آن را تایید کنید. این کار باعث ساخته شدن یک فایل package.json در root پروژه ی شما (پوشه ی اصلی) می شود.

{
  "name": "project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

نکته: اگر می خواهید با روش سریع تری فایل package.json را بسازی،  از دستور npm init --y استفاده کنید.

فیلدهایی که می بینید واضح هستند و نیازی به توضیح ندارند؛ main نقطه ی اصلی ورود به برنامه ی شماست و فیلد scripts نیز به شما اجازه می دهد که اسکریپت های خاصی بنویسید که در مواقع خاصی از زندگی یک پکیج اجرا می شوند. ما فعلا آن ها را نادیده می گیریم اما اگر خواهان اطلاعات بیشتری هستید به اسناد package.json در npm مراجعه کرده و مقالات آن را مطالعه کنید.

ما تصمیم گرفته ایم که برای مثال پکیج Underscore را نصب کنیم:

$ npm install underscore
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN nodedemo@1.0.0 No description
npm WARN nodedemo@1.0.0 No repository field.

+ underscore@1.9.1
added 1 package from 1 contributor and audited 1 package in 7.264s
found 0 vulnerabilities

حواستان باشد که یک فایل lockfile ایجاد شده است. بعدا به سراغ این فایل می آییم.

حالا اگر نگاهی به package.json بیندازیم، فیلد جدیدی به نام dependencies را می بینیم:

{
  ...
  "dependencies": {
    "underscore": "^1.9.1"
  }
}

در قسمت بعدی به سراغ مدیریت وابستگی ها با استفاده از package.json می رویم و در مورد برخی از ریزه کاری ها (مانند حذف پکیج ها، نصب نسخه ی خاصی از پکیج ها و...) صحبت می کنیم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش npm توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.