Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

NuGet (Anti-)Patterns - Tales from the Trenches

2,084 views

Published on

  • Be the first to comment

  • Be the first to like this

NuGet (Anti-)Patterns - Tales from the Trenches

  1. 1. www.realdolmen.com NUGET (ANTI-)PATTERNS: TALES FROM THE TRENCHESJANUARY 16, 2013 | SLIDE 1
  2. 2. WHO AM I? Xavier Decoster Antwerp, Belgium Technical Consultant, RealDolmen Co-founder of MyGet.org Microsoft Extended Experts Team Author of Apress Pro NuGet http://www.xavierdecoster.com @xavierdecosterJANUARY 16, 2013 | SLIDE 2
  3. 3. IN THIS SESSIONJANUARY 16, 2013 | SLIDE 3
  4. 4. IN THIS SESSIONJANUARY 16, 2013 | SLIDE 4
  5. 5. #0 – USE PACKAGE RESTORE  A source repository is for … sources  What’s a package repository for?  Impact of package restore  No more duplication of same binaries  Less merge conflicts (no binary diff)  Maintain overview of consumed packages in single place  Less network I/O (NuGet cache)  Contra-argument: single point of failure  Good remark: now deal with it!  Disconnected from package source(s)?JANUARY 16, 2013 | SLIDE 5
  6. 6. #1 – USE SEMANTIC VERSIONING Major Breaking changes Minor Backwards compatible API additions/changes Patch Bugfixes not affecting the API PreRelease Tag Alpha, Beta, …, RC1, RC2, … Build Build stamp, metadata, …  NuGet versioning algorithm differs from SemVer SemVer NuGet v x SemVer Versioning Scheme major.minor.patch[-prerelease][+build] v v NuGet pre-release package major.minor.patch-prerelease v v NuGet release package major.minor.patch x v Legacy Versioning Scheme major.minor.build.revisionJANUARY 16, 2013 | SLIDE 6
  7. 7. #2 – DON’T USE 3-DOTS VERSIONING  Even though NuGet supports it  Not supported in SemVer  Not supported in combination with pre-release tag  Instead use 2-Dots SemVer notation  Optionally with pre-release tagJANUARY 16, 2013 | SLIDE 7
  8. 8. #3 – MAINTAIN A SMOOTH UPGRADE PATH  Don’t change Package ID along the way!  Your packages will get stuck  So will your consumersJANUARY 16, 2013 | SLIDE 8
  9. 9. #3 – MAINTAIN A SMOOTH UPGRADE PATH MyGet.Core MyGet.Core … 1.0.1-alpha00001 1.0.1-alpha00256 MyGet.Core 1.0.1-alpha MyGet.Core 1.0.1  Version Precedence  1.0.1-alpha00001 < 1.0.1-alpha00256 < 1.0.1-alpha < 1.0.1  Question: Where does 1.0.1-alpha2 fit?  Don’t change Package ID along the way!JANUARY 16, 2013 | SLIDE 9
  10. 10. #4 – SPLIT PACKAGE REPOSITORIES BY AUDIENCE MyGet.Core MyGet.Core … 1.0.1-alpha00001 1.0.1-alpha00256 MyGet.Core 1.0.1-alpha MyGet.Core 1.0.1  Don’t pollute consumers’ repository with your internal DEV builds  MyGet.org is great at this: set up as many feeds as you want and promote packages from one to another (including nuget.org!)JANUARY 16, 2013 | SLIDE 10
  11. 11. #5 – ONCE PUBLISHED, DON’T DELETE PACKAGES  Unlist packages instead!  Maintains upgrade path  Still available through package restore  Supported by NuGet.org and MyGet.org  Using own NuGet server or file share?  Remove user permissions to delete!  Deleting  Breaks package restore!  Forces consumers to upgrade! “Attempting to force a user to do something is both an exercise in futility and a great way to guarantee that you have less users overall” - Rob ReynoldsJANUARY 16, 2013 | SLIDE 11
  12. 12. #6 – HAVE A FALLBACK REPOSITORY  Backup consumed packages  Mirror them on MyGet.org  Download them  Especially when using Package Restore  From NuGet.org  From any external feed  Each consumer has local cache  %LocalAppData%NuGetCacheJANUARY 16, 2013 | SLIDE 12
  13. 13. #7 – LOOK FOR BINDING REDIRECTS  Mitigates potential risk for conflicts  During assembly resolution <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" /> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>  Investigate why  Package versions not aligned? Package upgrades & version alignment can reduce the number of binding redirectsJANUARY 16, 2013 | SLIDE 13
  14. 14. #8 – USE SAMPLE PACKAGE OR README.TXT  Don’t pollute your actual packages  Provide a readme.txt  If you can’t automate the manual instructions  If you want to have your consumers read some specific info  Automatically presented to consumer during installation  Use a sample package when appropriate  Separate package  Different package ID  Convention: {packageID}.Sample  E.g.: NUnit  NUnit.Sample  Sample package depends on actual package you want to shipJANUARY 16, 2013 | SLIDE 14
  15. 15. #8 – USE SAMPLE PACKAGE OR README.TXTJANUARY 16, 2013 | SLIDE 15
  16. 16. #9 – UNINSTALL SHOULD LEAVE NO TRACES  Obvious, but often neglected/forgotten  Be a good citizen  Uninstall reverses installation + any side-effects  Unless modifications happened  Uninstall  Any files copied (binaries, sources, content, scripts…)  Tools package: any system modifications (PowerShell modules, registry keys, environment variables…)JANUARY 16, 2013 | SLIDE 16
  17. 17. http://www.xavierdecoster.com @xavierdecoster THANK YOU! Questions? Come get your MyGet stickers, you might get lucky! JANUARY 16, 2013 | SLIDE 17

×