pnpm 12 پایدار شد؛ این بار با Rust
خلاصهٔ کاملتر
تیم pnpm نسخهٔ 12 رو پایدار اعلام کرده. این نسخه بازنویسی کامل pnpm با زبان Rust هست، ولی خودشون تأکید میکنن که عمداً یک مهاجرت نیست: دستورها، فلگها، تنظیمات و فرمت لاکفایل نسخهٔ 11 همه سر جاشون موندن. چون تگ latest روی npm هنوز به خط 11 اشاره میکنه، نصب نسخهٔ 12 از تگ next-12 انجام میشه و Homebrew و winget و Scoop و Chocolatey فعلاً ارائهش نمیکنن.
pnpm self-update next-12از تغییرات ناسازگار، وابستگیهای گیت حالا بهجای مسیر انتقال یک هویت حساب میشن: برای GitHub و GitLab و Bitbucket یک specifier خودِ مخزن رو نام میبره نه پروتکل انتقال رو، همه از راه آدرس رسمی HTTPS حل میشن و دیگه آدرس SSH توی لاکفایل ثبت نمیشه. تنظیم ناشناخته توی pnpm-workspace.yaml هم دیگه بیصدا رد نمیشه؛ اگه پروژه نسخهٔ pnpm رو pin کرده باشه دستور با ERR_PNPM_UNRECOGNIZED_WORKSPACE_SETTINGS شکست میخوره و جاهای دیگه فقط هشدار میگیری.
حلقههای وابستگی موقع حل peer (یعنی وقتی pnpm تصمیم میگیره هر پکیج کدوم نسخه از وابستگی مشترکش رو بگیره) به شکل قطعی شکسته میشن: اعضای هر حلقه بر اساس id مرتب میشن و همیشه از یک نقطه بریده میشن. نتیجه اینه که لاکفایل تابعی محض از گراف وابستگیه و نصبهای تکراری خروجی بایتبهبایت یکسان میدن. روی ورکاسپیسهای پرحلقه، حل peer دو تا سه برابر سریعتره، حدود 25 درصد حافظهٔ کمتری میخوره و لاکفایل کوچیکتری میسازه.
از قابلیتهای تازه، shimهای آگاه از پروژه جالبن؛ shim یعنی واسطی که بهجای خود ابزار اجرا میشه و نسخهٔ درست رو صدا میزنه. حالا node یا deno یا bunِ سراسری همون نسخهای رو اجرا میکنه که پروژهٔ فعلی pin کرده، بدون هیچ hook شل. pnpm حالا خودش npm و Yarn و Bun رو هم نصب میکنه و با pnx میشه یکیشون رو برای یک دستور اجرا کرد. مهمتر از همه، رجیستری میتونه برای یک نسخهٔ منتشرشده آرتیفکت جایگزین بده، مثلاً بیلدی که آسیبپذیریش وصله شده، و pnpm اون رو با دایجست کامل SHA-512 توی لاکفایل ثبت میکنه:
packages:
lodash@4.17.21:
resolution:
integrity: sha512-<replacement-digest>
revision: 1از رفع باگهای قابل توجه، دستورهای سراسری مثل pnpm setup و pnpm self-update دیگه زیر sudo اجرا نمیشن و با ERR_PNPM_SUDO_NOT_SUPPORTED خطا میدن، چون pnpm بستههای سراسری رو توی خانهٔ کاربر نگه میداره. پایگاه دادهٔ سازگاری هم دیگه وابستگیهایی که از تحلیل ایستای پکیجها استخراج شده بودن رو اضافه نمیکنه، همونهایی که باعث میشدن TypeScript 7 زیر نسخههای قدیمی @typescript-eslint نصب بشه و ESLint خطا بده.
نکات کلیدی:
- نصب نسخهٔ 12 فعلاً از تگ next-12 انجام میشه؛ latest روی npm هنوز خط 11 رو نشون میده.
- حل peer روی گرافهای حلقهدار دو تا سه برابر سریعتر و حدود 25 درصد کممصرفتر شده و لاکفایل تکرارپذیره.
- وابستگی گیت روی GitHub و GitLab و Bitbucket همیشه از HTTPS رسمی حل میشه و SSH توی لاکفایل ثبت نمیشه.
- رویژن رجیستری اجازه میده یک نسخهٔ ثابت آرتیفکت وصلهشده بگیره و pnpm update --patches تازهش میکنه.
- روی لینوکس packageImportMethod: auto اول hardlink رو امتحان میکنه که روی btrfs زمان ساخت node_modules رو تقریباً نصف میکنه.




