عنوان:

‫مدیریت کارآمد حافظه پنهان NuGet


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۲۹ ۰۷:۳۸
آدرس: www.dntips.ir
در دنیای توسعه نرم‌افزار با استفاده از پلتفرم .NET، مدیریت وابستگی‌ها (Dependencies) از طریق NuGet به یک امر ضروری تبدیل شده است. NuGet به توسعه‌دهندگان اجازه می‌دهد تا به راحتی بسته‌های نرم‌افزاری مورد نیاز پروژه‌های خود را پیدا، نصب و مدیریت کنند. برای بهبود عملکرد و سرعت فرآیند نصب و بازیابی بسته‌ها، NuGet از چندین لایه حافظه پنهان (Cache) محلی استفاده می‌کند. درک نحوه عملکرد و مدیریت این حافظه‌های پنهان می‌تواند به حل مشکلات احتمالی و بهینه‌سازی فرآیند توسعه کمک شایانی کند. این مقاله به بررسی جامع حافظه‌های پنهان NuGet و روش‌های مدیریت آن‌ها می‌پردازد.

انواع حافظه‌های پنهان NuGet
NuGet از چهار نوع اصلی حافظه پنهان محلی استفاده می‌کند که هر کدام نقش خاصی در فرآیند مدیریت بسته‌ها ایفا می‌کنند:

حافظه پنهان بسته‌های سراسری (Global Packages Cache)
این حافظه پنهان، مکان اصلی ذخیره‌سازی بسته‌های NuGet دانلود شده (.nupkg) است. هنگامی که یک بسته برای اولین بار به یک پروژه اضافه می‌شود، از منبع (به احتمال زیاد nuget.org) دانلود شده و در این مکان ذخیره می‌گردد. اگر بسته مشابهی در پروژه‌های دیگر روی همان دستگاه مورد نیاز باشد، NuGet آن را مستقیماً از این حافظه پنهان بازیابی می‌کند و نیازی به دانلود مجدد نیست. این امر به طور قابل توجهی در زمان و پهنای باند صرفه‌جویی می‌کند.

حافظه پنهان HTTP (HTTP Cache)
این حافظه پنهان برای نگهداری فراداده (Metadata) مربوط به بسته‌های دانلود شده استفاده می‌شود. این فراداده می‌تواند شامل اطلاعاتی درباره نسخه‌ها، وابستگی‌ها و سایر جزئیات مربوط به بسته‌ها باشد. با ذخیره‌سازی این اطلاعات به صورت محلی، NuGet می‌تواند به سرعت اطلاعات مربوط به بسته‌ها را بازیابی کند بدون اینکه نیاز به برقراری ارتباط مجدد با منابع بسته باشد. محتویات این حافظه پنهان معمولاً به صورت فایل‌های با پسوند .dat ذخیره می‌شوند که در واقع فایل‌های JSON هستند.

حافظه پنهان افزونه‌ها (Plugins Cache)
این حافظه پنهان برای ذخیره‌سازی اطلاعات مربوط به افزونه‌های NuGet استفاده می‌شود. این اطلاعات می‌تواند شامل نتایج فراخوانی‌ها، مسیرهای اجرایی و توکن‌های اعتبارسنجی (Credential Tokens) برای منابع احراز هویت شده باشد. افزونه‌ها قابلیت‌های NuGet را گسترش می‌دهند و این حافظه پنهان به عملکرد کارآمدتر آن‌ها کمک می‌کند.

حافظه پنهان موقت (Temp Cache)
این حافظه پنهان برای نگهداری فایل‌های موقت و میانی در طول عملیات مختلف NuGet مانند بازیابی (Restore)، نصب (Install) و بسته‌بندی (Pack) استفاده می‌شود. این فایل‌ها معمولاً پس از اتمام عملیات مربوطه حذف می‌شوند، اما ممکن است در صورت بروز خطا باقی بمانند.

مشاهده مسیرهای حافظه پنهان NuGet
برای مشاهده مسیرهای تمام حافظه‌های پنهان NuGet روی دستگاه خود، می‌توانید از دستور زیر در خط فرمان .NET CLI (Command Line Interface) استفاده کنید:
dotnet nuget locals all --list
اجرای این دستور لیستی از مسیرهای مربوط به هر یک از حافظه‌های پنهان را نمایش می‌دهد. برای مثال، در یک سیستم macOS، خروجی ممکن است به شکل زیر باشد:
http-cache: /Users/rad/.local/share/NuGet/http-cache
global-packages: /Users/rad/.nuget/packages/
temp: /var/folders/q8/cdslzt2s6p1djnhp_y3ksc280000gn/T/NuGetScratch
plugins-cache: /Users/rad/.local/share/NuGet/plugin-cache

مدیریت حافظه‌های پنهان NuGet
با گذشت زمان، حجم حافظه‌های پنهان NuGet می‌تواند به طور قابل توجهی افزایش یابد. اگرچه این موضوع معمولاً مشکلی ایجاد نمی‌کند، اما در برخی موارد ممکن است لازم باشد حافظه‌های پنهان را پاک کنید. برای مثال، اگر با مشکلات مربوط به نصب یا به‌روزرسانی بسته‌ها مواجه هستید یا اگر گمان می‌کنید یک بسته خراب در حافظه پنهان وجود دارد، پاک کردن حافظه پنهان می‌تواند راه حل موثری باشد.

پاک کردن حافظه پنهان بسته‌های سراسری
برای پاک کردن حافظه پنهان بسته‌های سراسری، از دستور زیر استفاده کنید:
dotnet nuget locals global-packages --clear

پاک کردن حافظه پنهان HTTP
برای پاک کردن حافظه پنهان HTTP، از دستور زیر استفاده کنید:
dotnet nuget locals http-cache --clear

پاک کردن حافظه پنهان موقت
برای پاک کردن حافظه پنهان موقت، از دستور زیر استفاده کنید:
dotnet nuget locals temp --clear

پاک کردن تمام حافظه‌های پنهان
برای پاک کردن تمام حافظه‌های پنهان NuGet (شامل حافظه پنهان افزونه‌ها)، از دستور زیر استفاده کنید:
dotnet nuget locals all --clear
توجه داشته باشید که هیچ دستور مستقیمی برای پاک کردن فقط حافظه پنهان افزونه‌ها وجود ندارد و برای این کار باید از دستور پاک کردن تمام حافظه‌های پنهان استفاده کنید.

روش دستی پاک کردن حافظه‌های پنهان
علاوه بر استفاده از دستورات .NET CLI، شما می‌توانید به صورت دستی نیز محتویات پوشه‌های حافظه پنهان را حذف کنید. برای این کار، ابتدا با استفاده از دستور dotnet nuget locals all --list مسیرهای حافظه‌های پنهان را پیدا کرده و سپس محتویات آن پوشه‌ها را حذف نمایید. با این حال، استفاده از دستورات .NET CLI روشی امن‌تر و توصیه شده‌تر است.

ملاحظات مربوط به پاک کردن حافظه‌های پنهان
به طور کلی، پاک کردن حافظه‌های پنهان NuGet مشکلی ایجاد نمی‌کند، زیرا این حافظه‌ها در صورت نیاز مجدداً با دانلود یا بازیابی بسته‌ها پر می‌شوند. با این حال، اگر در زمان پاک کردن حافظه‌های پنهان، یکی از منابع NuGet شما در دسترس نباشد، ممکن است در فرآیند بازیابی مجدد بسته‌ها با مشکل مواجه شوید. بنابراین، اطمینان حاصل کنید که منابع NuGet مورد نیاز شما در دسترس هستند.

نتیجه‌گیری
مدیریت کارآمد حافظه‌های پنهان NuGet نقش مهمی در بهبود فرآیند توسعه با استفاده از پلتفرم .NET دارد. درک انواع مختلف حافظه‌های پنهان، نحوه عملکرد آن‌ها و روش‌های پاک کردن آن‌ها به توسعه‌دهندگان کمک می‌کند تا مشکلات مربوط به مدیریت بسته‌ها را به طور موثرتری حل کنند و فرآیند توسعه روان‌تری را تجربه نمایند. استفاده از دستورات .NET CLI ابزاری قدرتمند برای مدیریت این حافظه‌های پنهان است و به توسعه‌دهندگان امکان کنترل بیشتری بر محیط توسعه خود می‌دهد.


مشاهده مطلب اصلی

نظرات

  • سعید قاسمی در ۱۴۰۴/۰۲/۲۹ ۱۱:۴۱
    برای بالابردن پرفورمنس، مایکروسافت یکی دو سال پیش پیشنهاد داده بود که DevDrive رو فعال کنیم. تا اونجا که میدونم از لیست بالا میشه فقط آدرس global-packages رو عوض کرد و مثلا به Dev Drive منتقل کرد. سوال اینجاست که آیا میشه برای بقیه موارد این کار رو کرد؟ یعنی آدرس http-cache و temp رو هم روی این درایو تنظیم کرد؟ آیا اصلا برای بالابردن پرفورمنس و سرعت این تغییر خوب هست؟
    • وحید نصیری در ۱۴۰۴/۰۲/۲۹ ۱۲:۱۰
      برای تنظیم مسیر کش global-packages، باید به فایل %APPDATA%\NuGet\NuGet.Config در ویندوز مراجعه و کلید زیر را به آن اضافه کرد:
      <configuration>
        <config>
          <add key="globalPackagesFolder" value="D:\DevDrive\NuGet\global-packages" />
        </config>
      </configuration>

      برای تنظیم مسیر http-cache، باید متغیر محیطی NUGET_HTTP_CACHE_PATH را تغییر داد:
      setx NUGET_HTTP_CACHE_PATH "D:\DevDrive\NuGet\http-cache"

      برای تنظیم مسیر پوشه temp آن باید دو متغیر محیطی زیر را بازنویسی کرد که البته این مورد بر روی تمام برنامه‌های ویندوز هم تاثیر می‌گذارد:
      setx TEMP "D:\DevDrive\Temp"
      setx TMP "D:\DevDrive\Temp"

      البته به نظر من اینکار را نکنید بهتر است؛ چون باید این ملاحظات و محدودیت‌ها را مدنظر داشت:
      • تأثیر محدود در سناریوهای خاص: اگر پروژه‌های شما کوچک هستند یا تعداد پکیج‌های کمی دارند، تأثیر انتقال کش به DevDrive ممکن است ناچیز باشد. این بهینه‌سازی بیشتر برای پروژه‌های بزرگ و سازمانی یا سیستم‌هایی با بار کاری سنگین قابل‌توجه است.
      • نیاز به سخت‌افزار مناسب: DevDrive بهترین عملکرد را روی SSDهای NVMe ارائه می‌دهد. اگر از هارددیسک‌های سنتی یا SSDهای SATA استفاده می‌کنید، بهبود عملکرد ممکن است کمتر باشد.
      • پیچیدگی مدیریتtemp: تغییر متغیرهای TEMP و TMP روی کل سیستم تأثیر می‌گذارد و ممکن است باعث مشکلات غیرمنتظره در برنامه‌های دیگر شود. بهتر است ابتدا این تغییر را در یک محیط تستی امتحان کنید.
      • فضای دیسک: DevDrive معمولاً برای عملکرد بهینه به فضای اختصاصی نیاز دارد. اگر تعداد پکیج‌های NuGet شما زیاد است، باید فضای کافی روی DevDrive در نظر بگیرید (پوشه global-packages می‌تواند به‌سرعت چندین گیگابایت فضا اشغال کند).
      • پشتیبانی و پایداری: متغیرهایی مثل NUGET_HTTP_CACHE_PATH ممکن است در نسخه‌های آینده NuGet تغییر کنند یا به‌صورت رسمی پشتیبانی نشوند.