عنوان:

‫بازسازی کامل پوشه packages بسته‌های NuGet به صورت خودکار


نویسنده: وحید نصیری
تاریخ: ۱۳۹۲/۰۲/۲۷ ۱۶:۰
آدرس: www.dntips.ir
اگر قصد انتشار عمومی پروژه خود را دارید، نیازی به ارائه پوشه packages آن نیست. استفاده کننده نهایی به روشی که در ادامه توضیح داده خواهد شد، می‌تواند ارجاعات کل Solution را به یکباره به روز نماید؛ البته اگر تنها فایل یا فایل‌های packages.config پروژه‌های موجود پیوست شده و موجود باشند.


یک آزمایش

یک پروژه کنسول جدید را آغاز می‌کنیم. سپس به Solution آن یک Class library آزمایشی را نیز اضافه خواهیم کرد.
اکنون در خط فرمان پاورشل نیوگت (Tools > Library Package Manager > Package Manager Console) به هر یک از این دو پروژه، ارجاعی را به بسته structuremap از طریق دستور زیر اضافه می‌کنیم:
 Install-Package structuremap
اکنون یکبار پروژه را کامپایل کرده و سپس VS.NET را خاتمه می‌دهیم.
در ادامه پوشه‌های packages و همچنین bin و obj را کلا حذف می‌کنیم؛ اما فایل‌‌های متنی packages.config پروژه‌ها را نگه خواهیم داشت.
مجددا به VS.NET مراجعه خواهیم کرد. اینبار بر روی Solution کلیک راست کرده و گزینه «Enable NuGet Package Restore» را انتخاب می‌کنیم:


یک پوشه حاوی NuGet.exe به Solution جاری اضافه خواهد شد:



اکنون اگر پروژه را Build کنیم، تمام ارجاعات را به صورت خودکار از اینترنت (و یا کش موجود بر روی سیستم) دریافت و به Solution اضافه می‌کند.
به علاوه پوشه Packages نیز مجددا بازسازی خواهد شد.

پس از اینکار نهایتا برای اطمینان خاطر می‌توان دستور ذیل را در خط فرمان پاورشل نیوگت صادر کرد:
 Update-Package -Safe
این دستور به یکباره کلیه ارجاعات موجود packages را بررسی کرده و به روز خواهد کرد. پارامتر safe آن اختیاری است. اگر عنوان شود، سعی می‌کند همان شماره نگارشی را که در فایل‌های packages.config موجود است، دریافت و به روز نماید. در غیر اینصورت، آخرین فایل و آخرین نگارش موجود را دریافت و به روز رسانی خواهد کرد. به این ترتیب می‌توان به صرفه جویی زمانی قابل توجهی در یک پروژه با ارجاعات زیاد، رسید.
برای نمونه دستور update-package را بر روی یک پروژه MVC4 اجرا کنید تا این صرفه جویی زمانی را بهتر بتوانید حس کنید!


نتیجه گیری
لطفا حین ارائه عمومی پروژه خود، پوشه‌های bin، obj و همچنین packages آن‌را حذف کنید. استفاده کننده صرفا با داشتن فایل‌‌های packages.config به کمک روشی که عنوان شد می‌تواند ارجاعات کل Solution را بازیابی کند.

نظرات

  • توحید عزیزی در ۱۳۹۲/۰۲/۲۸ ۰:۱۲
    بسیار عالی. سپاسگزارم.
  • Ara در ۱۳۹۲/۰۲/۳۰ ۱۴:۵۳
    سلام
    خسته نباشید
    می‌خواستم بدونم برای اینکه یک پکیج لوکالی استفاده بشه چه باید کرد !
    مثلا مثلا DLL ‌های Framework  رو بشه Package  کرد و  همکاران شرکت پس تغییر یک dll  بتونن اون رو تو سیستم  خودشون آپدیت کنند !
     
    • وحید نصیری در ۱۳۹۲/۰۲/۳۰ ۱۵:۴
      برای استفاده لوکال در شبکه داخلی، امکان تهیه یک NuGet Server لوکال وجود داره: «Hosting Your Own NuGet Feeds». حتی شبیه به سایت گالری NuGet رو هم میشه لوکال نصب کرد؛ سورس باز است.
      • Ara در ۱۳۹۲/۰۳/۱۰ ۲۱:۳۳
        ممنون
        وب هاست نمی‌خواستم ، در مورد نحوه ساختن Package می‌خواستم بدونم، که فکر می‌کردم دنگ فنگ زیادی داره
        نمی‌دونستم براحتی دستور زیره
        nuget pack ProjectFile.csproj 
        که پکیج هام رو ساختم و گذاشتم تو یک فولدر تو ویژوال استودیو تو قسمت
        Options/Package Manger/Package Resources
        اضافه اش کردم
        البته این هم خوب بود برای ویرایش و غیره
        http://docs.nuget.org/docs/creating-packages/using-a-gui-to-build-packages 
  • ایلیا اکبری فرد در ۱۳۹۲/۰۴/۰۵ ۱۳:۲۱
    با سلام.
    چرا  وقتی که بر روی سولوشن کلیک راست میکنم گزینه Enable NuGet Package Restore  وجود ندارد. nuget ولی نصب شده است. با تشکر.
    • وحید نصیری در ۱۳۹۲/۰۴/۰۵ ۱۳:۳۴
      - این گزینه در آخرین نگارش‌های NuGet اضافه شده. نیاز است خود NuGet رو به روز کنید.
      - همچنین اگر مطابق شکل دوم، پوشه nuget. در پروژه موجود باشد، این گزینه ظاهر نخواهد شد.
  • منیژه محمدی در ۱۳۹۲/۰۸/۲۶ ۲۰:۵۷
    سلام من وقتی این خط را اجرا میکنم Install-Package structuremap  این خطا را بهم میدهد 
    PM> Install-Package structuremap
    Install-Package : The remote name could not be resolved: 'az320820.vo.msecnd.net'
    At line:1 char:16
    + Install-Package <<<<  structuremap
        + CategoryInfo          : NotSpecified: (:) [Install-Package], WebException
        + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand
      
    • وحید نصیری در ۱۳۹۲/۰۸/۲۶ ۲۱:۱۰
      remote name could not be resolved یعنی مشکل DNS و یا تنظیمات اتصالی را دارید به احتمال زیاد. آدرس زیر را در IE امتحان کنید (از این جهت که تنظیمات اینترنت IE به برنامه‌های دات نت به صورت پیش فرض اعمال می‌شوند). اگر باز نشد، مشکل اتصالی دارید:
      https://az320820.vo.msecnd.net/packages/structuremap.2.6.4.1.nupkg  
  • وحید نصیری در ۱۳۹۲/۱۱/۱۰ ۱۳:۱۳
    یک نکته‌ی تکمیلی
    مطلب جاری توسط تیم NuGet منسوخ شده اعلام گردیده و در نگارش‌های جدید آن، به صورت خودکار و بدون نیاز به هیچگونه تنظیم اضافه‌تری انجام می‌شود. بیشتر در اینجا
  • وحید نصیری در ۱۳۹۴/۰۱/۰۵ ۱۳:۰
    یک نکته‌
    اگر حین ارائه‌ی برنامه‌ی خود فایل exe مربوط به nuget را ارائه ندهید، پیام خطای یافت نشدن آن‌را در حین Build مشاهده خواهید کرد. برای رفع آن تنها کافی است فایل NuGet.targets را گشوده و دریافت خودکار nuget.exe را فعال کنید:
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
    این تنظیم به صورت پیش فرض غیرفعال است.
  • مجتبی دیناروند در ۱۳۹۴/۰۶/۲۲ ۱۲:۲۲
    دوستانی که بعد از دانلود پروژه‌ها با خطای T4MVC رو به رو میشن طبق گفته جناب نصیری در اینجا بهتره به صورت زیر عمل کنند :

    PM> update-package T4MVC -Reinstall -ProjectName MVC5.Web
    PM> update-package Microsoft.AspNet.Mvc -ProjectName MVC5.Web
    PM> update-package Microsoft.Web.Infrastructure -ProjectName MVC5.Web

    اگر این کار رو نکنید t4 خطا خواهد داد. البته با دستوری که در خود همین مطلب هم ذکر شده ، می‌توان این خطا رو برطرف کرد :

    Update-Package -Safe

    یکی از متن‌های خطایی که رخ میده به این صورت می‌باشد :

    Loading the include file 'T4MVC.tt.hooks.t4' returned a null or empty string. The transformation will not be run.
  • هادی جهانگیری در ۱۳۹۴/۰۸/۰۷ ۱۴:۲
    سلام هنگام بیلد پروژه روی چند تا از package‌ها پیغام زیر رو میدم
    The underlying connection was closed: An unexpected error occurred on a send. 
    • وحید نصیری در ۱۳۹۴/۰۸/۰۷ ۱۴:۱۰
      دسترسی به اینترنت، دسترسی به HTTPS، دسترسی به آدرس بسته‌ی مدنظر را بررسی کنید (^).