پرش به مطلب اصلی

فرآیند مهاجرت و به‌روزرسانی

در این بخش، نحوه به‌روزرسانی پکیج‌های پروژه و همچنین مدیریت نسخه pnpm را بررسی می‌کنیم. هدف این است که آپدیت‌ها به‌صورت امن و کنترل‌شده انجام شوند، بدون اینکه ریسک نصب یک نسخه ناپایدار یا آلوده را به جان بخریم.


آپدیت پکیج‌ها

برای به‌روزرسانی تمامی پکیج‌های پروژه (هم در dependencies و هم devDependencies) به آخرین نسخه پایدار، کافیست دستور زیر را در روت پروژه اجرا کنید:

pnpm update

این دستور تمام وابستگی‌ها را مطابق با رنج نسخه‌ای که در package.json تعریف شده، به‌روزرسانی می‌کند. اگر بخواهید پکیج‌ها را حتی با عبور از نسخه‌ی Major نیز به‌روز کنید، می‌توانید از فلگ --latest استفاده کنید:

pnpm update --latest
نکته

برای دیدن لیست پکیج‌های قدیمی پیش از آپدیت، می‌توانید دستور pnpm outdated را اجرا کنید.


قابلیت جدید pnpm 11: محدودیت سن انتشار پکیج‌ها (minimumReleaseAge)

از نسخه ۱۰.۱۶ به بعد، و به‌صورت پیش‌فرض از pnpm 11، قابلیتی به نام minimumReleaseAge معرفی شده است. این تنظیم باعث می‌شود pnpm نسخه‌هایی از پکیج‌ها را که به‌تازگی منتشر شده‌اند، بلافاصله نصب نکند.

چرا این قابلیت مهم است؟

در چند مورد از حملات زنجیره تأمین (Supply Chain Attack) اخیر در اکوسیستم npm، نسخه‌های آلوده‌ی پکیج‌های محبوب منتشر شده و معمولاً در عرض چند ساعت شناسایی و از رجیستری حذف شده‌اند. اگر پروژه‌ای دقیقاً در همان بازه‌ی کوتاه، آن نسخه را نصب کرده باشد، به‌طور ناخواسته کد آلوده وارد پروژه می‌شود.

با تنظیم یک حداقل «سن» برای انتشار پکیج، عملاً این ریسک به‌شکل قابل توجهی کاهش می‌یابد؛ چون تا قبل از گذشت زمان مشخص شده، آن نسخه قابل نصب نخواهد بود.

مقدار پیش‌فرض

به‌صورت پیش‌فرض در pnpm 11 این مقدار روی 1440 دقیقه (یک روز) تنظیم شده است. یعنی فقط نسخه‌هایی که حداقل یک روز از انتشارشان گذشته باشد، توسط pnpm نصب می‌شوند. برای اطلاعات کامل‌تر و مقادیر پیشنهادی، می‌توانید به مستندات رسمی pnpm مراجعه کنید.

اگر بخواهید این مقدار را خودتان تغییر دهید، کافیست در فایل pnpm-workspace.yaml پروژه آن را تعریف کنید:

minimumReleaseAge: 1440
اطلاع

واحد این مقدار دقیقه است؛ یعنی برای مثال مقدار 4320 معادل ۳ روز خواهد بود.

استثنا کردن پکیج‌های داخلی (minimumReleaseAgeExclude)

مشکلی که این محدودیت ایجاد می‌کند این است که پکیج‌های داخلی (مثل @dornica/*) که توسط تیم‌های داخلی شرکت توسعه و منتشر می‌شوند، نیز شامل این تأخیر می‌شوند؛ در حالی که ما می‌خواهیم آخرین نسخه‌ی پکیج‌های داخلی را همان لحظه‌ی انتشار دریافت کنیم (مثلاً برای رفع سریع یک باگ).

برای این منظور از تنظیم minimumReleaseAgeExclude استفاده می‌کنیم. این تنظیم بر اساس نام پکیج عمل می‌کند و از الگو (Pattern) هم پشتیبانی می‌کند.

کافیست در همان فایل pnpm-workspace.yaml این بخش را اضافه کنید:

minimumReleaseAgeExclude:
- '@dornica/*'

با این تنظیم:

  • تمام پکیج‌های بیرونی (مثل کتابخانه‌های عمومی npm) باید حداقل یک روز از انتشارشان گذشته باشد تا قابل نصب باشند.

  • تمام پکیج‌های داخلی سازمان که با @dornica/* شروع می‌شوند، از این قاعده مستثنی هستند و بلافاصله پس از انتشار، قابل نصب خواهند بود.

    هشدار

    این استثنا فقط برای پکیج‌هایی توصیه می‌شود که خودمان آن‌ها را منتشر می‌کنیم و به منبع و امنیت انتشارشان اطمینان کامل داریم. برای پکیج‌های بیرونی (Third-party) این کار توصیه نمی‌شود.


آپدیت نسخه pnpm

روش به‌روزرسانی خود ابزار pnpm بسته به اینکه آن را چطور نصب کرده‌اید، متفاوت است. در ادامه هر دو روش رایج را می‌بینید.

روش اول: استفاده از Corepack

اگر pnpm را از طریق Corepack (ابزار مدیریت پکیج‌منیجرهای Node.js) نصب و مدیریت می‌کنید، برای آپدیت به آخرین نسخه کافیست دستور زیر را اجرا کنید:

corepack prepare pnpm@latest --activate

این دستور آخرین نسخه‌ی pnpm را دانلود کرده و آن را به‌عنوان نسخه‌ی فعال سیستم تنظیم می‌کند.

دقت کنید که دستور بالا فقط نسخه‌ی فعال سیستم را آپدیت می‌کند و فیلد packageManager در package.json پروژه را تغییر نمی‌دهد. اگر پروژه‌ی شما این فیلد را تنظیم کرده باشد (که نسخه‌ی pnpm را پین می‌کند)، باید برای هماهنگ کردن آن با نسخه‌ی جدید، دستور زیر را در ریشه‌ی پروژه اجرا کنید:

corepack use pnpm@latest

این دستور هم آخرین نسخه‌ی pnpm را نصب می‌کند و هم مقدار فیلد packageManager را در package.json به‌روزرسانی می‌کند.

روش دوم: نصب از طریق npm

اگر pnpm را به‌صورت گلوبال از طریق npm نصب کرده‌اید، برای آپدیت دو راه دارید:

۱. استفاده از دستور داخلی pnpm self-update:

pnpm self-update
اطلاع

اگر پروژه‌ی شما در package.json فیلد packageManager تنظیم شده باشد، این دستور فقط همان فیلد را به نسخه‌ی جدید آپدیت می‌کند (و آن را گلوبال نصب نمی‌کند). در دفعه‌ی بعدی که دستوری از pnpm اجرا کنید، خودش به‌صورت خودکار نسخه‌ی مشخص‌شده را دانلود و فعال می‌کند.

اگر این فیلد تنظیم نشده باشد، دستور بالا نسخه‌ی جدید را به‌صورت گلوبال نصب و فعال می‌کند.

۲. نصب مجدد گلوبال از طریق npm:

npm install -g pnpm@latest

این روش به‌خصوص وقتی مفید است که دستور self-update با خطا مواجه شود (معمولاً به این دلیل که نسخه‌ی فعلی pnpm با ابزار دیگری غیر از npm نصب شده است).


با رعایت این مراحل، هم پکیج‌های پروژه و هم خود ابزار pnpm به‌صورت ایمن و به‌روز نگه داشته می‌شوند.