pnpm pack-app: اپ Node.js رو به فایل اجرایی تبدیل کن
خلاصهٔ کاملتر
pnpm در نسخه ۱۱ یه قابلیت تجربی جالب اضافه کرده به اسم pack-app. این دستور میتونه یه فایل CommonJS (همون CJS) رو بگیره و ازش یه فایل اجرایی کاملاً مستقل بسازه؛ فایلی که روی سیستمهای مختلف بدون نیاز به نصب Node.js اجرا میشه.
زیر پوست این ابزار از Node.js Single Executable Applications API استفاده میشه؛ یه قابلیتی که از مدتی پیش توی Node.js وجود داره ولی استفاده مستقیم ازش کمی پیچیدهست. حالا pnpm این پیچیدگی رو قایم کرده و یه اینترفیس ساده روش گذاشته.
با یه دستور ساده میشه همزمان برای چند پلتفرم مختلف خروجی گرفت؛ مثلاً linux-x64، win32-x64 و darwin-arm64 رو با هم بیلد کرد. هر پلتفرم خروجیاش رو توی یه پوشه جداگانه میذاره و فایلهای ویندوز هم به طور خودکار پسوند exe میگیرن.
برای اجرای این دستور، سیستم میزبان باید Node.js نسخه ۲۵.۵ به بالا داشته باشه تا بتونه SEA blob رو inject کنه. اگه نسخه فعلی کمتر باشه، pnpm خودش یه builder مناسب رو دانلود میکنه، پس نگران این موضوع نباشین.
خروجیهای macOS به خاطر اینکه SEA injection امضای کد رو خراب میکنه، به صورت خودکار ad-hoc sign میشن. روی مک این کار با codesign انجام میشه و روی لینوکس با ldid. البته cross-compile از ویندوز برای مک پشتیبانی نمیشه.
پلتفرمهای پشتیبانیشده شامل لینوکس (x64 و arm64، با یا بدون musl)، macOS (x64 و arm64) و ویندوز (x64 و arm64) میشن. پسوند musl فقط برای لینوکس کاربرد داره و برای محیطهایی مثل Alpine Linux مفیده.
میشه همه تنظیمات رو مثل entry point، targets، runtime و output directory رو یه بار توی package.json زیر کلید pnpm.app تعریف کرد و بعد فقط با pnpm pack-app بدون هیچ آرگومانی کار رو انجام داد. البته اگه بخوای یه بیلد خاص بگیری، میتونی با پاس دادن --target روی CLI لیست targetها رو موقتاً override کنی.
نکات کلیدی:
- pack-app یه قابلیت تجربیه و ممکنه در آینده تغییر کنه
- از Node.js Single Executable Applications API استفاده میکنه
- فایل ورودی باید CJS باشه (نه ESM)
- Node.js نسخه ۲۵.۵ به بالا برای بیلد لازمه، وگرنه pnpm خودش builder رو دانلود میکنه
- میشه همزمان برای لینوکس، مک و ویندوز خروجی گرفت
- تنظیمات پیشفرض در package.json زیر کلید pnpm.app تعریف میشن
- بیلد مک از ویندوز ممکن نیست؛ باید از لینوکس یا خود مک انجام بشه




