درود دوستان! توی برنامه‌های جاوااسکریپتی حتماً فایل package-lock.json رو دیدیم. این فایل رو معمولاً ما توسعه‌دهنده‌ها خیلی به صورت مستقیم باهاش سر و کار نداریم. ولی خوبه که بدونیم این فایلِ کاملاً کاربردی، کمک می‌کنه که برنامهٔ ما زمانی که توی محیط‌های مختلف Deploy میشه یا توسط یک شخص دیگه توسعه داده میشه، رفتار و خروجی پایدار و قابل پیش‌بینی داشته باشه. توی این پست کوتاه می‌خوایم ویژگی و کاربرد این فایل رو بررسی کنیم.

 

فایل package-lock.json چیه؟ 🤔

این فایل رو با فایل package.json اشتباه نگیریم! فایل package-lock.json به صورت خودکار توسط ابزارهای مدیریت پکیج مثل npm و Yarn تولید میشه و توی اون، ورژن دقیق پکیج‌هایی که توی برنامه استفاده شده ذخیره میشه. وقتی پروژهٔ ما توی محیط‌های دیگه Deploy میشه یا یک توسعه‌دهندهٔ جدید قراره روی اون کار کنه، وجود فایل package-lock.json هنگام اجرای دستور npm install این اطمینان رو میده که دقیقاً همون ورژن از پکیج‌هایی برای ما نصب بشن که انتظار داریم. این کار باعث میشه که برنامهٔ ما توی محیط‌های مختلف رفتارهای یکسان و قابل پیش‌بینی داشته باشه.

شاید این سوال پیش بیاد که وقتی ورژن پکیج‌ها توی فایل package.json ذخیره شده، دیگه چه نیازی به فایل package-lock.json داریم. ابتدا فرض کنیم این محتویات فایل package.json برنامهٔ ما هست:

{
  "name": "my-app",
  "dependencies": {
    "react": "^17.0.0"
  }
}

وجود علامت ^ ابتدای ورژن react به این معنیه که می‌خوایم ورژن 17 ری‌اکت رو نصب کنیم و اینکه کدوم ورژن Minor مثل 17.1 یا 17.2 نصب بشن برامون مهم نیست.

وقتی بدون حضور فایل package-lock.json دستور npm install رو می‌زنیم، npm آخرین ورژن موجود برای ری‌اکت 17 رو برامون نصب می‌کنه. حالا اگه بعدها یک توسعه‌دهندهٔ دیگه یا حتی خودمون دستور npm install رو بزنیم، ممکنه ورژن متفاوتی از ری‌اکت 17 برامون نصب بشه (مثلاً 17.3). با این اتفاق مشکلاتی مثل عدم سازگاری یا خروجی‌های متفاوت بین برنامه‌ها به وجود میاد و در نتیجه برنامهٔ ما قابل اطمینان نخواهد بود. فایل package-lock.json برای حل چنین مشکلاتی معرفی شد.

فایل package-lock.json علاوه‌بر اینکه ورژن دقیق پکیج‌هایی مد نظرمون رو ذخیره می‌کنه، جزییاتی مثل Dependency های اون پکیج و آدرس URL ـی که اون پکیج باید از اونجا دانلود بشه رو هم ذخیره می‌کنه. فایل package-lock.json زیر، نمونهٔ تولید شده برای فایل package.json بالا هست:

{
  "name": "my-app",
  "lockfileVersion": 1,
  "dependencies": {
    "react": {
      "version": "17.2.0",
      "resolved": "https://registry.npmjs.org/react/-/react-17.2.0.tgz",
      "integrity": "sha512-..."
      // additional package information
    }
  }
}

همونطور که می‌بینیم، ورژنی که برای ری‌اکت توی این فایل در نظر گرفته شده 17.2.0 هست. بنابراین اگه هر جای دیگه برنامهٔ ما Deploy بشه، مطمئن هستیم که همین ورژن از ری‌اکت برامون نصب میشه.

اگه توی پروژه‌ای فایل package-lock.json وجود نداشته باشه، با اجرای دستور npm install این فایل به صورت خودکار تولید میشه. همچنین با اضافه کردن یک پکیج جدید به برنامه، این فایل هم به صورت خودکار آپدیت میشه. پس نیازی نیست (و نباید) خودمون این فایل رو دستکاری کنیم.

 خب دوستان، امیدوارم از این اطلاعات استفاده کرده باشین. روزتون خوش 😉👋