مدیریت متمرکز پکیجها (CPM) در NET. : یک بار برای همیشه! ✨
روزهایی رو به یاد میارم که مدیریت پکیجهای NuGet در چندین پروژه یک دردسر واقعی بود. میدونید چی میگم - یه سولوشن بزرگ رو باز میکنی و میبینی هر پروژه از یه نسخه متفاوت از همون پکیج استفاده میکنه. اصلاً جالب نیست! 😫
بذارید بهتون نشون بدم که چطور مدیریت متمرکز پکیجها (CPM) در NET. میتونه این مشکل رو یک بار برای همیشه حل کنه.
مشکلی که باید حل کنیم 💥
من اغلب با سولوشنهایی کار میکنم که پروژههای زیادی دارن. سولوشنهایی با ۳۰ یا بیشتر پروژه غیرمعمول نیستن. هر کدوم به پکیجهای مشابهی مثل Serilog یا Polly نیاز دارن. قبل از CPM، پیگیری نسخههای پکیج یه افتضاح بود:
🔹 یک پروژه از Serilog 4.1.0 استفاده میکرد.
🔹 دیگری از Serilog 4.0.2.
🔹 و یه جوری، سومی از Serilog 3.1.1!
نسخههای مختلف میتونن رفتار متفاوتی داشته باشن که منجر به باگهای عجیبی میشه که پیدا کردنشون سخته. من ساعتهای زیادی رو برای رفع مشکلات ناشی از عدم تطابق نسخهها تلف کردهام.
مدیریت متمرکز پکیجها چگونه کمک میکند؟ 🎮
CPM
رو مثل یک مرکز کنترل برای تمام نسخههای پکیجتون در نظر بگیرید. به جای تنظیم نسخهها در هر پروژه، اونها رو یک بار در یک جا تنظیم میکنید. بعد، فقط به پکیجی که میخواید استفاده کنید، بدون مشخص کردن نسخه، ارجاع میدید. به همین سادگی!
برای استفاده از مدیریت متمرکز پکیجها به این موارد نیاز دارید:
✅ NuGet نسخه 6.2 یا جدیدتر
✅ .NET SDK نسخه 6.0.300 یا جدیدتر
✅ اگر از ویژوال استودیو استفاده میکنید، نسخه 2022 17.2 یا جدیدتر
راهاندازی آن 📁
اول، یک فایل به نام Directory.Packages.props در پوشه اصلی سولوشن خود ایجاد کنید:
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Serilog" Version="4.1.0" />
<PackageVersion Include="Polly" Version="8.5.0" />
</ItemGroup>
</Project>
در فایلهای پروژهتون، میتونید پکیجها رو با استفاده از PackageReference بدون نسخه لیست کنید:
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="AutoMapper" />
<PackageReference Include="Polly" />
</ItemGroup>
همین! حالا تمام پروژههای شما از یک نسخه پکیج یکسان استفاده خواهند کرد.
✨️کارهای باحالی که میتونید انجام بدید
نیاز به نسخهای متفاوت برای یک پروژه دارید؟ 🎯
مشکلی نیست! فقط این رو به فایل پروژهتون اضافه کنید:
<PackageReference Include="Serilog" VersionOverride="3.1.1" />
📍پراپرتی VersionOverride به شما اجازه میده نسخه خاصی که میخواید رو تعریف کنید.
یه پکیج رو تو همه پروژهها میخواید؟ 🌍
اگه پکیجهایی دارید که هر پروژهای بهشون نیاز داره، میتونید اونها رو سراسری کنید. یک GlobalPackageReference در فایل props خود تعریف کنید:
<ItemGroup>
<GlobalPackageReference Include="SonarAnalyzer.CSharp" Version="10.3.0.106239" />
</ItemGroup>
حالا هر پروژهای به طور خودکار این پکیج رو دریافت میکنه!
مهاجرت پروژههای موجود به CPM 🚚
1️⃣ فایل Directory.Packages.props رو در ریشه سولوشن ایجاد کنید.
2️⃣ تمام نسخههای پکیج رو از فایلهای .csproj خود به اونجا منتقل کنید.
3️⃣ ویژگی Version رو از عناصر PackageReference حذف کنید.
4️⃣ سولوشن خود را بیلد کرده و هرگونه تداخل نسخه رو برطرف کنید.
5️⃣ قبل از کامیت کردن، به طور کامل تست کنید.
همچنین یه ابزار CLI به نام CentralisedPackageConverter وجود داره که میتونید برای اتوماتیک کردن مهاجرت ازش استفاده کنید.
چه زمانی باید از CPM استفاده کنید؟ 🤔
من دلیل قانعکنندهای برای استفاده نکردن پیشفرض از این قابلیت نمیبینم.
من توصیه میکنم از CPM استفاده کنید وقتی:
• پروژههای زیادی دارید که پکیجهای مشترک دارن.
• از رفع باگهای مربوط به نسخه خسته شدهاید.
• میخواید مطمئن بشید همه از نسخههای یکسان استفاده میکنن.
جمعبندی 📝
نکات من برای موفقیت با مدیریت متمرکز پکیجها:
💡 وقتی CPM رو به یه سولوشن موجود اضافه میکنید، این کار رو در یک change/PR جداگانه انجام بدید.
💡 اگه نسخهای رو override میکنید، یه کامنت بذارید که دلیلش رو توضیح بده.
💡 نسخههای پکیج خود را به طور منظم برای آپدیتها چک کنید.
💡 فقط پکیجهایی رو سراسری کنید که واقعاً همه جا بهشون نیاز دارید.
🔖 هشتگها:
#CSharp #DotNet #NuGet #DependencyManagement #BestPractices #CleanCode #Developer #VisualStudio