با سلام و احترام به این قسمت از سری آموزشی کار با npm خوش آمدید. در این قسمت می خواهیم چند مسئله ی مهم را بررسی کنیم: اول مدیریت وابستگی ها با استفاده از فایل package.json، دوم حذف پکیج های محلی، سوم نصب ورژن خاصی از یک پکیچ و چهارم بروزرسانی پکیج های npm. بنابراین بهتر است بدون مقدمه شروع کنیم.
اگر یادتان باشد در جلسه ی قبل Underscore v1.9.1 را نصب کردیم:
{ ... "dependencies": { "underscore": "^1.9.1" } }
علامت caret (^
) در ابتدای شماره ی نسخه نشان می دهد که npm هنگام نصب این پکیج، بروزترین و جدیدترین نسخه ی آن را دانلود می کند (تنها نسخه ی اصلی و بدون توجه به اعشار باید همخوانی داشته باشد) مگر آنکه فایل package-lock.json
وجود داشته باشد. در مورد پکیج ما یعنی هر چیزی قبل از نسخه ی v2.0.0. این روش نسخه بندی وابستگی ها semantic versioning (نسخه بندی معنایی) نام دارد. همچنین توجه داشته باشید که Underscore به عنوان یک خصوصیت (property) در فیلد dependencies
قرار گرفته است. این رفتار در نسخه ی جدید npm به صورت پیش فرض تعیین شده است و روی پکیج هایی انجام می شود که برای اجرای برنامه مورد نیاز باشند.
البته می توانید پکیج ها را به صورت devDependency
نیز ذخیره کنید؛ برای این کار باید از دستور save-dev--
استفاده شود. devDependencies
پکیج هایی هستند که برای توسعه استفاده می شوند (به طور مثال برای انجام تست های مختلف و transpiling کدها). همچنین اگر private: true
را به فایل package.json
اضافه کنید جلوی اتفاقاتی مانند انتشار تصادفی کدهای خصوصی و اخطارهای تولید شده هنگام اجرای دستور npm install
را می گیرید.
اما هیچ کدام از این موارد دلیل اصلی استفاده از package.json
نیست. دلیل اصلی استفاده از فایل package.json
تعیین وابستگی ها برای پرتابل (سیار) شدن محیط کاری است. به طور مثال زمانی که کدهای فرد دیگری را clone (کپی) می کنید، کافی است دستور npm i
را در روت پروژه اجرا کنید تا npm تمام پکیج های لازم را برای اجرای برنامه بارگیری کند.
قبل از تمام کردن این قسمت بهتر است ببینیم Underscore کار می کند یا خیر؛ فایلی به نام test.js
در روت پروژه بسازید و دستورات زیر را به آن اضافه کنید:
const _ = require("underscore"); console.log(_.range(5));
حالا با استفاده از node test.js
فایل را اجرا کنید. باید در خروجی عبارت [0, 1, 2, 3, 4]
را مشاهده کنید.
npm یک سیستم مدیریت پکیج است بنابراین باید بتواند پکیج ها را حذف کند. فرض کنید پکیج Underscore فعلی برای ما دردسرساز شده و با یکی از پکیج های دیگر ما ناسازگار است. برای حذف این نسخه و نصب یک نسخه ی قدیمی تر می توانیم این کار را انجام بدهیم:
$ npm uninstall underscore removed 2 packages in 0.107s $ npm list project@1.0.0 /home/sitepoint/project └── (empty)
حالا می توانیم نسخه ی Underscore ای که می خواهیم را نصب کنیم. برای مشخص کردن نسخه باید از علامت @ استفاده کنیم:
$ npm install underscore@1.9.0 + underscore@1.9.0 added 1 package in 1.574s $ npm list project@1.0.0 /home/sitepoint/project └── underscore@1.9.0
فرض کنید می خواهیم ببینیم برای Underscore نسخه ی جدیدی آمده است یا خیر. در این صورت می گوییم:
$ npm outdated Package Current Wanted Latest Location underscore 1.9.0 1.9.1 1.9.1 project
ستون Current نسخه ای را نمایش می دهد که به صورت محلی نصب شده است. ستون Latest آخرین نسخه ی موجود از آن پکیج را نشان می دهد. ستون Wanted نیز آخرین نسخه ی موجودی را نشان می دهد که می تواند بدون خراب کردن کدهای ما روی سیستم نصب شود.
فایل package-lock.json
در npm v5 معرفی شد و کارش اطمینان از یکسان بودن وابستگی ها روی تمام دستگاه هایی است که پروژه روی آن ها نصب می باشد. هر کجا که npm پوشه ی node_modules
یا فایل package.json
را تغییر دهد، فایل package-lock.json
نیز به صورت خودکار ساخته می شود.
می توانید این مسئله را تست کنید؛ پوشه ی node_modules
را حذف کرده و npm i
را اجرا کنید. آخرین نسخه ی npm پکیج Underscore v11.9.0 را نصب می کند چرا که این نسخه در فایل package-lock.json
ذکر شده است اما نسخه های قبلی به خاطر قوانین semantic versioning نسخه ی v1.9.1 را دانلود می کنند. قبل از اینکه این قابلیت معرفی شود، تفاوت در نسخه های پکیج ها دردسر بزرگی برای توسعه دهندگان بود و راه حل آن هم استفاده از فایلی به نام npm-shrinkwrap.json
بود که باید به صورت دستی ایجاد می شد.
حالا فرض کنید Underscore باگ نسخه ی قبلی اش را تصحیح کرده است و ما هم قصد به روز رسانی به نسخه ی جدید را داریم. بنابراین می گوییم:
$ npm update underscore + underscore@1.9.1 updated 1 package in 0.236s $ npm list project@1.0.0 /home/sitepoint/project └── underscore@1.9.1
نکته: برای اینکه این مثال به طور صحیح کار کند باید Underscore را به عنوان یک وابستگی در فایل package.json
اضافه کرده باشید. همچنین اگر ماژول های متعدد و قدیمی دارید و می خواهید همه را به روز رسانی کنید باید از دستور npm update
استفاده کنید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.