npm می تواند پکیج ها را به صورت local (محلی) یا global (سراسری) نصب کند. در حالت محلی پکیج ها در پوشه ی node_modules
(یک پوشه قبل از مسیر اصلی کاری شما) نصب می شوند که متعلق به کاربر فعلی (user) است. در حالت سراسری پکیج ها در /prefix}/lib/node_modules}
نصب می شوند که متعلق به root است (در این حالت {prefix}
معمولا /usr/
یا /usr/local
است).
بنابراین برای نصب پکیج ها به صورت سراسری باید از دستور sudo
استفاده کنید که دو مشکل بالقوه دارد: اول آنکه ممکن است هنگام کار با وابستگی های دیگر باعث بروز خطای permission ها شود و دوم آنکه یک نگرانی امنیتی ایجاد کند. پس باید این مشکل را حل کنیم.
ابتدا دستور 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
ما در حال حاضر فقط یک پکیج را نصب داریم؛ خود پکیج 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 یا وابستگی می گوییم.
برای مشاهده ی لیستی از پکیج های سراسری خود می توانید از دستور 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
زمانی که می خواهیم پکیج ها را به صورت محلی نصب کنیم معمولا از فایل 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 می رویم و در مورد برخی از ریزه کاری ها (مانند حذف پکیج ها، نصب نسخه ی خاصی از پکیج ها و...) صحبت می کنیم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.