Package Manager ابزاری است که توسعهدهندگان برای یافتن، دانلود، نصب، پیکربندی، ارتقاء و حذف پکیجهای مورد نیاز خود به طور خودکار از آن استفاده میکنند. در این مقاله قصد داریم تا درمورد Package Managerهایی مانند NPM و Yarn صحبت کنیم و هر آن چه را که برای شروع کار با آنها لازم است بدانیم را مورد بررسی قرار دهیم.
چرا در کار توسعه خود به یک Package Manager نیاز داریم؟ در ادامه به این سوال پاسخ خواهیم داد.
اگر فرض کنیم که هیچ Package Managerای وجود نداشت، در این صورت تمام کارهای زیر را باید به صورت دستی انجام میدادیم:
مدیریت دستی دهها یا صدها پکیج یک کار خستهکننده و بسیار وقتگیر است. بنابراین، Package Managerهایی مانند NPM، pNPM، Bower و Yarn به ما کمک میکنند تا فرآیند خستهکننده مدیریت دستی packageها به شکل خودکار انجام شود.
البته باید به این موضوع توجه کنیم که Package Manager با Package Registry یکسان نیست.
Package Manager ابزاری است که توسعهدهندگان برای یافتن، دانلود، نصب، پیکربندی، ارتقاء و حذف پکیجهای کامپیوتری بهطور خودکار از آن استفاده میکنند.
NPM (Node Pachage Manager) و Yarn (Yet Another Resource Negotiator) دو Package Manager پرکاربرد هستند.
Package Registry یک پایگاه داده برای ذخیرهسازی هزاران پکیج(کتابخانهها، پلاگینها، چارچوبها یا ابزارها) است. به عبارت دیگر، مکانی است که پکیجها در آن منتشر و نصب میشوند.
NPM Registry و GitHub Packages دو Package Registry پرکاربرد هستند.
اکنون که میدانیم Package Manager چیست و چرا به آن نیاز داریم، میتوانیم نحوه استفاده از دو مورد از پرکاربردترینها یعنی NPM و Yarn را بررسی کنیم.
البته باید به این موضوع توجه داشته باشیم که بحثهای متعددی در مورد ارجحیت NPM به Yarn وجود دارد، ولی ما در این مقاله از آنها اجتناب میکنیم زیرا بهترین Package Manager همانی است که بهترین کار را برای ما انجام میدهد.
بنابراین، این مقاله نشان میدهد که NPM و Yarn چگونه کار میکنند، نه اینکه بگوید کدام یک از آنها بهترین است. درنهایت این ما هستیم که تصمیم میگیریم کدام یک را انتخاب کنیم.
همچنین امکانی که وجود دارد این است که میتوانیم برای یک پروژه از NPM و برای پروژهی دیگر از Yarn استفاده کنیم.
NPM هنگام نصب Node به طور خودکار نصب میشود. بنابراین، برای نصب NPM بر روی سیستم خود، به وبسایت NodeJS میرویم و آخرین LTS نود یا نسخه فعلی را دانلود میکنیم.
بهتر است Yarn را از طریق NPM نصب کنیم. بنابراین، ابتدا NPM را از وب سایت Node.js دانلود و نصب کنیم. سپس برای نصب Yarn به صورت زیر ادامه میدهیم:
npm install -g yarn
برای بررسی نسخه Node.js نصب شده روی سیستم خود، دستور زیر را اجرا میکنیم:
node -v
منظور از علامت v- در دستور بالا مخفف --version
است.
برای بررسی نسخه NPM نصب شده روی سیستم خود، دستور زیر را اجرا میکنیم:
npm -v
برای بررسی نسخه Yarn نصب شده روی کامپیوتر خود،دستور زیر را اجرا میکنیم:
yarn -v
برای این که NPM را به آخرین نسخه موجود ارتقا دهیم دستور زیر را اجرا میکنیم:
npm install npm@latest -g
برای ارتقا Node.js به آخرین نسخه دو راه وجود دارد:
یکی از راههای ارتقای NodeJS، این است که به شکل دستی آخرین نسخه را از وبسایت Node.js دانلود و نصب کنیم.
راه دیگر این است که از یک version manager مانند NVM، n یا nvs استفاده کنیم.
برای این که Yarn به آخرین نسخه آپدیت پیدا کند، دستور زیر را اجرا میکنیم:
yarn set version latest
اکنون که NPM(و یا Yarn) را روی کامپیوتر خود داریم، میتوانیم از manager نصب شده برای پیدا کردن، نصب، پیکربندی و حذف پکیجهای پروژه خود استفاده کنیم.
اما منظور از پکیج دقیقا چیست؟
پکیج یک دایرکتوری(یا پروژه) است که دارای یک فایل package.json
میباشد که برای ثبت اطلاعات مربوط به آن مورد استفاده قرار میگیرد.
موضوعی که باید به آن توجه کنیم این است که ما فقط میتوانیم پکیجها(پروژهای که با فایل package.json
توصیف شده است) را در NPM registry منتشر کنیم.
دو راه برای نصب پکیج وجود دارد: محلی یا سراسری.
پکیجای که به شکل محلی نصب شده است، فقط در پروژهای که آن را نصب کردهایم میتوانیم مورد استفاده قرار دهیم.
برای نصب یک پکیج به صورت محلی، مراحل زیر را طی میکنیم:
توجه: باید Node و NPM را روی سیستم خود داشته باشیم تا بتوانیم از دستورات نصبNPM (و یا Yarn) استفاده کنیم.
npm install package-name --save
باید توجه داشته باشیم که دستور --save
در دستور بالا به NPM میگوید تا package-name
را در فایل package.json
به عنوان یکی از بستههایی که پروژه به آن وابسته است، ذخیره کند.
اگر بخواهیم یک نسخه مشخص از یک پیکج را نصب کنیم در چنین حالتی، یک @[version-number]
بعد از نام پکیج اضافه میکنیم:
npm install package-name@4.14.1 --save
از طرف دیگر، اگر پکیجای که نصب میکنیم برای اهداف توسعه و تست است، از دستور زیر استفاده میکنیم:
npm install package-name --save-dev
دستورات بالا باعث میشود تا NPM سه مورد را در دایرکتوری root پروژه ما دانلود کند: یک پوشه node_modules
، یک فایل package.json
و یک فایل package-lock.json
. در ادامه به شکل مفصل درباره این موارد صحبت خواهیم کرد.
yarn add package-name
اگر بخواهیم یک نسخه مشخص از یک پکیج را نصب کنیم در چنین حالتی، یک @[version-number]
بعد از نام پکیج اضافه میکنیم:
yarn add package-name@4.14.1
از طرف دیگر، اگر پکیجای که نصب میکنیم برای اهداف توسعه و تست است، از دستور زیر استفاده میکنیم:
yarn add package-name --dev
دستورات بالا باعث میشود تا Yarn سه مورد را در دایرکتوری root پروژه ما دانلود کند: یک پوشه node_modules، یک فایل package.json و یک فایل yarn.lock. در ادامه بهطور کامل درباره این موارد صحبت خواهیم کرد.
پکیجای که به شکل سراسری نصب میشود این قابلیت را دارد تا در هر نقطهای از سیستم خود بتوانیم از آن استفاده کنیم. برای نصب پکیج به صورت سراسری، دستور زیر را در ترمینال اجرا میکنیم:
npm install package-name -g
و یا اینکه میتوانیم از Yarn به صورت زیر استفاده کنیم:
yarn global add package-name
بهطور کلی بهتر است که پکیج مورد نیاز خود را به صورت محلی نصب کنیم. در ادامه به برخی از تفاوتهای بین نصب محلی و سراسری اشاره کردهایم:
پکیج محلی در دایرکتوری که در دستور npm install package-name
(و یا yarn add package-name
) اجرا میکنیم، نصب میشود.
به طور خاص، پکیجهای نصب شده محلی پروژه را در دایرکتوریnode_module
آن خواهیم یافت. اما در مقابل، یک پکیج نصب شده به شکل سراسری در یک مکان واحد روی سیستم ما نصب میشود و مکان دقیق، به پیکربندی سیستم بستگی دارد.
اگر پکیج خود را به صورت محلی نصب کرده باشیم، میتوانیم از نسخههای مختلف یک پکیج برای توسعه چند اپلیکیشن استفاده کنیم. با این حال، اگر پکیج را به شکل سراسری نصب کنیم، مجبور میشویم از یک نسخه پکیج یکسان برای همه برنامههای خود استفاده کنیم.
نصب محلی این امکان را به ما میدهد تا بتوانیم پکیجهای پروژه را که میخواهیم به آخرین نسخه ارتقا دهیم را انتخاب کنید. این امر مدیریت بهروزرسانیهایی را که سازگاری با پکیجهای دیگر را مختل میکنند، آسانتر میکند.
با این حال، ارتقاء یک پکیج نصب شده در سطح سراسری، بسته را برای همه پروژهها بهروزرسانی میکند. که این اتفاق میتواند سازگاری با بستههای دیگر را به هم بزند و مشکلات بسیار زیادی را برای نگهداری آنها ایجاد کند.
نصب سراسری برای پکیجهایی که قصد داریم از آنها فقط در خط فرمان خود استفاده کنیم بهترین انتخاب است، به خصوص زمانی که دستورات اجرایی قابل استفاده مجدد در پروژهها را ارائه میدهند. اما نصب محلی برای پکیجهایی که قصد داریم از طریق دستور import
یا تابع require()
از آنها استفاده کنیم، بهترین انتخاب میباشد.
NPM، React Native CLI، Gatsby CLI، Grunt CLI و Vue CLI نمونههای شناخته شدهای از پکیجهای سراسری هستند. همینطور Webpack، Lodash، Jest و MomentJS نیز از نمونههای رایج پکیجهای محلی بهشمار میروند.
البته باید به نکات زیر توجه داشته باشیم:
node_modules
نصب میکنند. و اگر دستور --save
را مشخص کرده باشیم، manager جزئیات مربوط به پکیج را به فایل json اضافه خواهد کرد.اما پوشهnode_modules
، فایل package.json
، فایل package-lock.json
و فایل yarn.lock
دقیقا چیست؟
node_modules
چیست؟دایرکتوری node_modules
پوشهای است که NPM تمام پکیجهایی را که به صورت محلی برای پروژه مدنظر ما دانلود میکند، در آن قرار میدهد.
package.json
چیست؟فایل package.json یک سند JSON است که Package Managerها(مانند NPM و Yarn) برای ذخیرهسازی اطلاعات مربوط به یک پروژه خاص از آن استفاده میکنند.
به عبارت دیگر، فایل package.json فایل متادیتا یک پروژه است.
package.json
یک فایل package.json
:
package.json
به دایرکتوری root پروژه خود میرویم و با اجرای دستور زیر یک فایل package.json
ایجاد میکنیم:
npm init
یا اگر از Yarn استفاده میکنیم، باید دستور زیر را اجرا کنیم:
yarn init
هنگامی که دستور مقداردهی اولیه که در بالا به آن اشاره کردیم را اجرا کنیم، Package Manager با پرسیدن چند سوال در مورد پروژه ما را در ایجاد فایل package.json
راهنمایی میکند. اما اگر بخواهیم از این سوالات رد شویم، میتوانیم یک فایل package.json
بصورت پیشفرض ایجاد کنیم.
package.json
فرض کنید ترجیح میدهیم از سوالاتی که توسط دستور npm init
(یا yarn init
) پرسیده میشود، صرفنظر کنیم. در چنین شرایطی، به دایرکتوری root پروژه خود میرویم و دستور زیر را اجرا میکنیم:
npm init -y
و یا اگر Package Managerای که استفاده میکنیم Yarn است، دستور زیر را اجرا میکنیم:
yarn init -y
دستورات بالا از مقادیر پیشفرض استخراج شده از دایرکتوری فعلی برای ایجاد فایل package.json
پروژه ما استفاده میکند.
توجه: علامت y- مخفف --yes
است.
هنگامی که Package Manager فرآیند مقداردهی اولیه خود را به پایان میرساند، فایل package.json
پروژه ما حاوی یک آبجکت با مجموعهای از ویژگیها خواهد بود.
به عنوان مثال:
{ "name": "codesweetly-project", "version": "1.0.0", "main": "index.js" }
همانطور که میبینید فایل package.json
حاوی نام، نسخه و فیلدهای اصلی میباشد. در ادامه با این ویژگیها بیشتر آشنا خواهیم شد.
package.json
ویژگیهای package.json
باعث میشود تا پروژه ما برای Package Managerها و کاربران نهایی قابل استفاده باشد.
فرض کنید میخواهیم پکیج خود را در NPM registry منتشر کنیم. در این صورت، فایل package.json
ما باید دارای فیلدهای “name”و “version” باشد.
با این حال اگر قصد نداشته باشیم که پکیج خود را منتشر کنیم، در این صورت همه فیلدها از جمله ویژگیهای “name” و “version” اختیاری هستند.
در ادامه فیلدهای رایج در فایل package.json
بیشتر بررسی میکنیم.
فیلد “name” ویژگی است که برای ثبت یک نام برای پروژه، مورد استفاده قرار میگیرد.
در ویژگی “name” موارد زیر را باید رعایت کنیم:
باید توجه داشته باشیم که میتوانیم کلمات را با خط تیره و underline به هم متصل کنیم.
مثلا:
{ "name": "code_sweetly-project" }
فیلد “version” شماره نسخه فعلی پروژه را نشان میدهد.
ویژگی “version” باید به شکل قالب major.minor.patch
باشد و همچنین از دستورالعملهای نسخهبندی معنایی پیروی کند.
به عنوان مثال:
{ "version": "1.0.0" }
فیلد “description” یک ویژگی است که شرح مختصری از اهداف پروژه ما را شامل میشود.
NPM توصیه میکند یک ویژگی “description” داشته باشیم تا پکیج ما راحتتر در وب سایت NPM پیدا شود. چون توضیحات ما یکی از مواردی است که هنگام اجرای فرمان جستجوی در npm نشان داده میشود.
به عنوان مثال:
{ "description": "A brief description about this package (project)" }
فیلد “main”در واقع entry point یک پروژه را نشان میدهد. به عبارت دیگر، زمانی که شخصی تابع require()
را اجرا میکند، Node فراخوانی را به require(<package.json:main>)
برطرف میکند.
مثلا:
{ "main": "./src/index.js" }
فیلد “private” به Package Managerها اجازه میدهد تا بدانند که آیا باید پروژه ما را در NPM registry منتشر کنند یا خیر.
به عنوان مثال:
{ "private": true }
اگر ویژگی “private” را در فایل package.json
خود روی true تنظیم کنیم، Package Managerها پروژه ما را منتشر نخواهند کرد.
بنابراین، تنظیم این ویژگی یک راه عالی برای جلوگیری از انتشار تصادفی پکیج مورد نظر ما میباشد.
فیلد “scripts” شامل دستورات اسکریپتی است که میخواهیم در زمانهای مختلف در طول lifecycle پروژه خود اجرا کنیم.
به عنوان مثال:
{ "scripts": { "test": "jest", "dev": "webpack --mode development", "build": "webpack --mode production", "predeploy": "npm run build", "deploy": "gh-pages -d build" } }
فیلد “scripts” بالا حاوی پنج ویژگی است که مقادیر آنها دستوراتی است که میخواهیم Package Manager ما هر زمان که key ویژگی را فراخوانی میکنیم، اجرا کند. برای مثال، اگر npm run dev
را اجرا کنیم دستور “webpack --mode development
” اجرا میشود.
فیلد “keywords” مجموعهای از کلمات کلیدی را مشخص میکند که میتواند به افراد در پیدا کردن پکیج ما کمک کند.
به عنوان مثال:
{ "keywords": [ "drag", "drop", "drag and drop", "dragndrop", "draggable" ] }
ویژگی “keywords” بخشی از اطلاعاتی است که هنگام اجرای فرمان جستجوی npm نشان داده میشود.
فیلد “author” شامل فهرستی از اطلاعات و جزئیات مربوط به نویسنده پروژه است.
به عنوان مثال:
{ "author": "Oluwatobi Sofela <oluwatobiss@codesweetly.com> (https://www.codesweetly.com)" }
همچنین دستور بالا را میتوانیم به شکل زیر نیز بنویسیم:
{ "author": { "name": "Oluwatobi Sofela", "email": "oluwatobiss@codesweetly.com", "url": "https://www.codesweetly.com" } }
توجه به این نکته لازم است که ویژگیهای “email” و “url” ختیاری هستند.
فیلد “dependencies” شامل لیستی است که تمام پکیجهایی که یک پروژه برای تولید به آنها وابسته است را دربرمیگیرد.
مثلا:
{ "dependencies": { "first-package": "^1.0.4", "second-package": "~2.1.3" } }
بنابراین، زمانی که یک کاربر پروژه ما را از NPM registry نصب میکند، ویژگی dependencies تضمین میکند که Package Managerها میتوانند بهطور خودکار پکیجهای فهرست شده را پیدا و نصب کنند.
ما میتوانیم از طریق یکی از راههایی که در زیر به آنها اشاره شده است، پکیجی را به فیلد “dependencies” اضافه کنیم:
npm install package-name --save-prod
را در ترمینال خود اجرا کنیم. یا اگر از Yarn استفاده میکنیم، yarn add package-name
را اجرا کنیم.فیلد “devDependencies” شامل فهرستی از تمام پکیجهایی میباشد که پروژه در تولید به آنها نیاز ندارد، اما برای اهداف توسعه محلی و تست مورد نیاز میباشد.
به عنوان مثال:
{ "devDependencies": { "first-dev-package": "^5.8.1", "second-dev-package": "3.2.2—۴٫۰٫۰" } }
باید به این نکته توجه کنیم که پکیجهای لیست شده در فیلد “devDependencies” در محیط توسعه پروژه در دسترس هستند اما در سرور محصول موجود نخواهند بود.
فرض کنید کاربری پروژه ما را از طریق دستور npm install
(یا yarn add
) نصب میکند. در چنین حالتی، Package Manager تمام devDependenciesهای لیست شده را در دایرکتوری node_modules
پروژه پیدا کرده و دانلود میکند.
از طریق یکی از راههایی که در زیر به آنها اشاره شده است، میتوانیم پکیجی را به فیلد “devDependencies” اضافه کنیم:
npm install package-name --save-dev
را در ترمینال خود اجرا کنیم. یا اگر از Yarn استفاده میکنیم، yarn add package-name --dev
را اجرا کنیم.فیلد “homepage” نشانی اینترنتی صفحه اصلی پروژه ما را مشخص میکند.
به عنوان مثال:
{ "homepage": "https://codesweetly.com/package-json-file-explained" }
تا اینجا مفاهیم مربوط به فایل package.json
را مورد بررسی قرار دادیم، در ادامه میخواهیم درمورد package-lock.json
صحبت کنیم.
package-lock.json
چیست؟فایل package-lock.json
سندی است که NPM برای ثبت نسخه دقیق همه پکیجهایی که به صورت محلی در دایرکتوری node_modules
پروژه خود نصب کردهایم، استفاده میکند.
یک فایل package-lock.json
برنامه را دقیقاً همانطور که آن را در NPM registry منتشر کردیم،۱۰۰% قابل بازتولید میکند.
بنابراین، فرض کنید کاربری برنامه ما را شبیهسازی و کلون کرده و دستور npm install
را اجرا میکند. در چنین حالتی، package-lock.json
تضمین میکند که کاربر نسخه دقیق تمام پکیجهایی را که برای توسعه برنامه خود استفاده کردهایم، دانلود خواهد کرد.
یا به عنوان مثال، فرض کنید کاربری برنامه ما را که حاوی فایل package-lock.json
نیست، کلون کرده است و یکی از پکیجهای مورد استفاده در برنامه دارای نسخه جدیدتری است.
فرض کنید شماره نسخه پکیج در فایل package.json
دارای علامت caret باشد (مثلاً ^۲٫۶٫۲
). در این صورت، NPM آخرین نسخه پکیج مدنظر را نصب میکند، که این موضوع ممکن است باعث شود تا برنامه نتایج اشتباه تولید کند.
اما اکنون فرض کنید کاربر برنامه ما را که حاوی فایل package-lock.json
است کلون کرده است. در این صورت، NPM نسخه دقیق پکیج موردنظر را همانطور که در فایل package-lock.json
ثبت شده است، صرف نظر از اینکه نسخه جدیدتری وجود دارد یا خیر،نصب خواهد کرد.
بنابراین، کاربران همیشه برنامه ما را به همان روشی که آن را در NPM registry منتشر کردهایم دریافت میکنند. به عبارت دیگر، NPM از فایل package-lock.json
برای قفل کردن وابستگیهای پکیج ما به شماره نسخههای خاصی که برای توسعه پروژه استفاده کردهایم، استفاده میکند.
توجه: زمانی که ما دستور npm update
را اجرا کنیم، NPM همه پکیجهای ثبت شده در فایل package-lock.json
را بهروزرسانی میکند.
yarn.lock
چیست؟فایل yarn.lock
سندی است که Yarn از آن برای ثبت نسخه دقیق همه پکیجهایی که به صورت محلی در دایرکتوری node_modules
پروژه خود نصب کردهایم، استفاده میکند. که البته فایل yarn.lock
با فایل lock-lock.json
مربوط به NPM قابل مقایسه است.
همانطور که قبلاً اشاره کردیم Package Manager ما یک پکیج نصب شده را اجرا نمیکند، بلکه ما خودمان باید این کار را انجام دهیم. در ادامه بحث خواهیم کرد که چگونه باید این کار را انجام دهیم.
راههای مختلفی برای ران کردن یک پکیج قابل اجرا وجود دارد. در ادامه تکنیکهای استاندارد معرفی شده است.
یکی از راههای اجرا کردن این نوع پکیجها این است که مسیر محلی آن را در خط فرمان خود تایپ کنیم:
./node_modules/.bin/package-name
package.json
اضافه کنیمیکی از راههای جایگزین برای اجرای پکیج این است که ابتدا آن را به فیلد “scripts” در فایل package.json
پروژه خود اضافه کنیم، مانند:
{ "name": "your_package", "version": "1.0.0", "scripts": { "desired-name": "name-of-package-to-execute" } }
پس از آن، پکیج را میتوانیم به صورت زیر اجرا کنیم:
npm run desired-name
توجه داشته باشید که دستور بالا مخفف npm run-script-and-name
است.
همچنین اگر از Yarn استفاده میکنیم، میتوانیم پکیج را به صورت زیر اجرا کنیم:
yarn run desired-name
به عنوان مثال:
{ "name": "codesweetly-app", "version": "1.0.0", "scripts": { "build": "webpack", } }
دستور بالا webpack را به فیلد “scripts” در فایل package.json
ما اضافه میکند. بنابراین، اکنون میتوانیم webpack را در خط فرمان به صورت زیر اجرا کنیم:
npm run build
و یا اگر از Yarn استفاده میکنیم:
yarn run build
یک راه سریعتر برای اجرای یک پکیج اجرایی استفاده از NPX مانند دستور زیر است:
npx package-name
با NPX، دیگر نیازی نیست پکیج خود را به فیلد “scripts” فایل package.json
پروژه خود اضافه کنیم.
(Node Package Execute) NPX یک اجراکننده پکیج Node است که به طور خودکار پکیج مشخصی را پیدا کرده و اجرا میکند.
به عنوان مثال:
npx webpack
دستور بالا به طور خودکار webpack را پیدا کرده و سپس اجرا میکند. بنابراین، ما نیازی به اضافه کردن ویژگی “build”:” webpack” به فیلد “scripts” فایل package.json
خود نداریم.
توجه: هنگام نصب Node 8.2/NPM 5.2.0 یا نسخههای بالاتر، NPX به طور خودکار روی سیستم ما نصب میشود.
همچنین میتوانیم با استفاده از نسخه دلخواه Node.js بسیاری از کدها را اجرا کنیم. در ادامه به بررسی این موضوع میپردازیم.
برای این کار میتوانیم از کاراکتر @ و پکیج نود npm برای تعیین نسخه Node.js که میخواهیم برای اجرای کد خود تعیین کنیم، استفاده کنیم.
مثلا:
npx node@7 index.js
دستور بالا به NPX میگوید که index.js را با آخرین نسخه Node از نسخه ۷ اصلی اجرا کند.
بطور کلی استفاده از دستور node@
راهی مفید برای جلوگیری از استفاده از ابزارهای مدیریت نسخه Node.js مانند nvm برای جابجایی بین نسخههای Node به حساب میآید.
فرض کنید میخواهیم نسخه Node که NPX برای اجرای کد ما از آن استفاده میکند را تأیید کنیم. در این صورت دستور زیر را اجرا میکنیم:
npx node@7 -v
دستور بالا آخرین نسخه Node از نسخه ۷ اصلی که NPX برای اجرای کد ما استفاده میکند، به عنوان مثال نسخه ۷٫۱۰٫۱ را نشان خواهد داد.
برای تعیین اینکه آیا هر یک از پکیجهای پروژه ما قدیمی و منسوخ شده هستند یا خیر، دستور زیر را اجرا میکنیم:
npm outdated
اگر پس از اجرای دستور هیچ خروجی وجود نداشته باشد، به این معنی است که تمام پکیجهای پروژه ما بهروز هستند. در غیر این صورت، توضیح دقیق درمورد خروجی خط فرمان در این مقاله آورده شده است.
همچنین اگر از Yarn استفاده میکنیم:
yarn outdated
توجه: برای بررسی وضعیت یک پکیج خاص، میتوانیم نام پکیج را پس از کلمه کلیدی outdated اضافه کنیم. به عنوان مثال، npm outdated lodash
.
برای تشخیص اینکه کدام پکیج سراسری منسوخ شده است، دستور زیر را اجرا میکنیم:
npm outdated -g --depth=0
سه راه برای بررسی پکیجهای نصب شده به شکل محلی وجود دارد:
npm list
اگر از Yarn استفاده میکنیم:
yarn list
npm list --depth=0
هنگام استفاده از Yarn:
yarn list --depth=0
npm list package-name
سه راه برای بررسی پکیجهای نصب شده به شکل سراسری وجود دارد:
npm list -g
اگر از Yarn استفاده میکنیم:
yarn list -g
npm list -g --depth=0
هنگام استفاده از Yarn:
yarn list -g --depth=0
npm list -g package-name
در اینجا نحوه بهروزرسانی پکیجها با استفاده از NPM و Yarn را بررسی کردهایم:
نحوه بهروزرسانی یک پکیج خاص به آخرین نسخه آن
npm update package-name
اگر از Yarn استفاده کنیم:
yarn upgrade package-name
npm update
هنگام استفاده از Yarn:
yarn upgrade
ما میتوانیم یک پکیج خاص از پروژه را که به شکل سراسری نصب شده است، به صورت زیر بهروزرسانی کنیم:
npm update package-name -g
npm update -g
در این قسمت نحوه حذف پکیجها با استفاده از NPM و Yarn را بررسی کردهایم:
ابتدا از طریق خط فرمان به دایرکتوری root پروژه خود میرویم و دستور زیر را اجرا میکنیم:
npm uninstall package-name
نکات مهمی که باید به آنها توجه کنیم:
--save
) را برای حذف ارجاعات به پکیج، به فیلد dependencies در فایل package.json
پروژه خود اضافه میکنیم.–save-dev
) را برای حذف ارجاعات به پکیج، به فیلد devDependencies در فایل package.json
پروژه خود اضافه میکنیم.برای پروژههایی که با Yarn مدیریت میشوند:
yarn remove package-name
توجه: دستور yarn remove فایلهایpackage.json
و yarn.lock
پروژه را به طور خودکار بهروزرسانی میکند.
npm uninstall package-name -g
باید به این موضوع توجه داشته باشیم که بهترین کار این است که پکیجها را به صورت دستی از پوشه node_modules
حذف نکنیم. زیرا این عمل میتواند بر روی ماژولهای(modules) پکیجهای دیگر نیز تأثیر بگذارد.
اما منظور از ماژول(module) در NodeJS دقیقا چیست؟
یک ماژول در NodeJS هر فایلی در پوشه node_modules
است که کامپیوتر میتواند از طریق تابعrequire()
نود آن را لود کند.
به عنوان مثال:
const myModule = require("./codesweetly.js");
فرض میکنیم کامپیوتر با موفقیت از تابع require()
برای لود کردن فایل codesweetly.js
استفاده کرده است. در چنین حالتی codesweetly.js
یک ماژول است که به متغیر myModule اختصاص داده شده است.
باید به خاطر داشته باشیم که یک ماژول ممکن است یک پکیج باشد، اما این موضوع همیشه صادق نیست.
اگر ماژول فایل package.json
برای ثبت اطلاعات مورد نیازی که در آن استفاده می شود، نداشته باشد یک پکیج نیست. همچنین باید به این نکته توجه داشته باشیم برای اینکه یک ماژول توسط تابعrequire()
قابل لود باشد، ماژول باید یکی از موارد زیر باشد:
NPM یک رجیستری رایگان برای نویسندگان پکیجهای عمومی است. بنابراین میتوانیم از آن برای انتشار هر پروژهای از کامپیوتر خود که دارای فایل package.json
است، استفاده کنیم.
در ادامه مراحلی که برای به اشتراک گذاشتن پروژه خود نیاز داریم، معرفی شده است:
به وبسایت NPM مراجعه میکنیم و وارد حساب کاربری خود میشویم (اگر هنوز حساب کاربری نداریم، ثبت نام میکنیم).
توجه: حتما باید مطمئن شویم که ایمیل خود را پس از ایجاد یک حساب کاربری جدید تایید کرده باشیم. در غیر این صورت هنگام انتشار پکیج خود با خطای ۴۰۳ Forbidden مواجه خواهیم شد.
از طریق خط فرمان و دستور زیر به حساب کاربری NPM خود وارد میشویم، مانند:
npm login
توجه: می توانیم برای بررسی اینکه آیا در حال حاضر وارد حساب خود شدهایم یا خیر، از دستور npm whoami
استفاده کنیم.
به دایرکتوری root پروژه خود میرویم و آن را به صورت زیر منتشر میکنیم:
npm publish
باید از این موضوع مطمئن شویم که در NPM پکیج با نامگذاری مشابه وجود نداشته باشد. در غیر این صورت هنگام انتشار با خطا مواجه خواهیم شد.
اگر میخواهیم بررسی کنیم که آیا نام مدنظر ما قبلاً در NPM وجود داشته یا خیر، میتوانیم از فرمان جستجوی npm (یا نوار جستجوی در وبسایت NPM) برای این کار استفاده کنیم.
فرض کنید همه نامهای مناسب برای پکیج ما قبلاً گرفته شده است. در این صورت، NPM به ما این امکان را میدهد پروژه خود را تحت عنوان یک محدوده(scope) منتشر کنیم. به عبارت دیگر، میتوانید پکیج خود را به عنوان زیرمجموعه نام کاربری خود منتشر کنیم.
فایل package.json
خود را باز میکنیم و نام کاربری خود را به عنوان پیشوند نام پکیج خود قرار میدهیم.
مثلا:
{ "name": "@username/package-name", "version": "1.0.0", "main": "index.js", "license": "MIT" }
تنظیمات پیشفرض NPM به این صورت است که یک پکیج با نام محدوده را پروژه خصوصی درنظر میگیرد. بنابراین، اگر از دستور npm publish
برای به اشتراک گذاشتن پکیج با نام محدوده استفاده کنیم، با خطا مواجه خواهیم شد.
بنابراین، برای انتشار پکیج خود به عنوان محدوده نام کاربری، علامت --access=public
را به دستور npm publish
اضافه کنید:
npm publish --access=public
توجه: میتوانیم با استفاده از دستورnpm init --scope=username
به جای npm init
، پروژه خود را در همان مرحله مقداردهی اولیه به یک پکیج scoped تبدیل کنیم.
این مقاله به این موضوع که Package Manager چیست پرداختیم. همچنین نحوه کار دو package manager محبوب یعنی NPM و Yarn را بررسی کردیم.