<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 <title>The NuGet Team Blog</title>
 <link href="http://blog.nuget.org/feeds/atom.xml" rel="self"/>
 <link href="http://blog.nuget.org/"/>
 <updated>2013-05-21T08:48:50-07:00</updated>
 <id>http://blog.nuget.org/feeds/atom.xml</id>
 <author>
   <name>The NuGet Team</name>
   <email>nugetgallery@outercurve.org</email>
 </author>
 
 <entry>
   <title>Where else is NuGet used in Visual Studio?</title>
   <link href="http://blog.nuget.org/20130520/where-else-is-nuget-used-in-visual-studio.html"/>
   <updated>2013-05-20T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130520/where-else-is-nuget-used-in-visual-studio</id>
   <content type="html">&lt;p&gt;All NuGet users are probably familiar with both the Manage NuGet Packages dialog and the Package Manager Console. These are the main user interfaces for installing and managing packages.&lt;/p&gt;

&lt;p&gt;However, NuGet is also used in a couple of more subtle places. Below are a few of them that I am aware of. With the exception of the New Project dialog, these dialogs/commands invoke NuGet through the &lt;a href='http://docs.nuget.org/docs/reference/invoking-nuget-services-from-inside-visual-studio'&gt;well-documented MEF services&lt;/a&gt; that NuGet exports.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New Project dialog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you create a new Web Application project, either a Web Forms or MVC app, the project template invokes NuGet to install a set of pre-defined packages into the new project.&lt;/p&gt;

&lt;p&gt;This feature is publicly documented here: &lt;a href='http://docs.nuget.org/docs/reference/packages-in-visual-studio-templates'&gt;http://docs.nuget.org/docs/reference/packages-in-visual-studio-templates&lt;/a&gt;. Which means it&amp;#8217;s not only available to Microsoft templates, but to any Visual Studio template.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Service Reference dialog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you open the Add Service Reference dialog to add a reference to a WCF Data Service endpoint, the tool uses NuGet to install the latest version of the &lt;strong&gt;Microsoft.Data.Services.Client&lt;/strong&gt; package and its dependencies.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Publish dialog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you attempt to publish your web app to Windows Azure, the Publish dialog detects if your project is using SqlMembership provider, and if so, will ask you to upgrade to Universal provider in order to work with SQL Azure. If you accept, it will install the &lt;strong&gt;Microsoft.AspNet.Providers&lt;/strong&gt; and &lt;strong&gt;Microsoft.AspNet.Providers.Core&lt;/strong&gt; packages, as well as configure your web.config to use the Universal provider.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/publish-dialog.png' alt='Publish dialog' /&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable Azure Authentication command&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you enable &lt;a href='http://www.asp.net/vnext/overview/latest/windows-azure-authentication'&gt;Windows Azure Active Directory&lt;/a&gt; authentication in your web app, the command will install the &lt;strong&gt;System.IdentityModel.Tokens.ValidatingIssuerNameRegistry&lt;/strong&gt; package.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Windows Azure Cloud Service project command&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Add Windows Azure Cloud Service project&lt;/strong&gt; command, which appears on the context menu for Web projects, uses NuGet to install the &lt;strong&gt;WindowsAzure.Storage&lt;/strong&gt; and &lt;strong&gt;Microsoft.WindowsAzure.ConfigurationManager&lt;/strong&gt; packages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;#8217;m very happy to see various teams in Microsoft take advantage of NuGet to implement their own features. I expect even more widespread usage of NuGet in future versions of Visual Studio.&lt;/p&gt;

&lt;p&gt;-Luan&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Play with Packages, programmatically!</title>
   <link href="http://blog.nuget.org/20130520/Play-with-packages.html"/>
   <updated>2013-05-20T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130520/Play-with-packages</id>
   <content type="html">&lt;p&gt;One of the many often seen requests, from developers using NuGet, is examples on our NuGet core APIs. The requests range from finding meta-data for the packages to installing the package programmatically. In this blog post, I will provide a few examples of using NuGet Core APIs.&lt;/p&gt;

&lt;h3 id='getting_started'&gt;Getting Started&lt;/h3&gt;

&lt;p&gt;To use NuGet Core APIs, install &lt;strong&gt;NuGet.Core&lt;/strong&gt; NuGet package in your project and add &lt;strong&gt;NuGet&lt;/strong&gt; namespace to your &lt;strong&gt;using&lt;/strong&gt; statements.&lt;/p&gt;

&lt;h3 id='get_me_the_prereleased_versions_of_a_package'&gt;Get me the pre-released versions of a package&lt;/h3&gt;

&lt;p&gt;Let&amp;#8217;s say you would like to get the list of all pre-released versions of &lt;strong&gt;EntityFramework&lt;/strong&gt; package. Below is the code snippet that would get you the list using NuGet API v2.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//ID of the package to be looked up
string packageID = &amp;quot;EntityFramework&amp;quot;;
		
//Connect to the official package repository
IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(&amp;quot;https://packages.nuget.org/api/v2&amp;quot;);
        
//Get the list of all NuGet packages with ID &amp;#39;EntityFramework&amp;#39;       
List&amp;lt;IPackage&amp;gt; packages = repo.FindPackagesById(&amp;quot;packageID&amp;quot;).ToList();

//Filter the list of packages that are not Release (Stable) versions
packages = packages.Where (item =&amp;gt; (item.IsReleaseVersion() == false)).ToList();

//Iterate through the list and print the full name of the pre-release packages to console
foreach (IPackage p in packages)
{
	Console.WriteLine(p.GetFullName());
}&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='help_me_get_a_package'&gt;Help me get a package&lt;/h3&gt;

&lt;p&gt;Let&amp;#8217;s say you would like to programmatically download and unzip a package in the path you want. Below is the code snippet that you would use to download and unzip the package in the path specified. The example below downloads and unzips &lt;strong&gt;EntityFramework 5.0.0&lt;/strong&gt; to one of my projects.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//ID of the package to be looked up
string packageID = &amp;quot;EntityFramework&amp;quot;;
		
//Connect to the official package repository
IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(&amp;quot;https://packages.nuget.org/api/v2&amp;quot;);

//Initialize the package manager
string path = &amp;lt;PATH_TO_WHERE_THE_PACKAGES_SHOULD_BE_INSTALLED&amp;gt;
PackageManager packageManager = new PackageManager(repo, path);
        
//Download and unzip the package
packageManager.InstallPackage(packageID, SemanticVersion.Parse(&amp;quot;5.0.0&amp;quot;));&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='its_quite_easy_have_fun'&gt;It&amp;#8217;s quite easy, have fun!&lt;/h3&gt;

&lt;p&gt;As illustrated by the above examples, trying to work with NuGet packages programmatically is quite easy. Start exploring them today!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A quick note about the new MinClientVersion attribute</title>
   <link href="http://blog.nuget.org/20130430/a-quick-note-about-minclientversion-feature.html"/>
   <updated>2013-04-30T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130430/a-quick-note-about-minclientversion-feature</id>
   <content type="html">&lt;p&gt;In the NuGet 2.5 release, we added the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-2.5##Add_a_%27Minimum_NuGet_Version%27_property_to_packages'&gt;MinClientVersion&lt;/a&gt; property to the package manifest schema to allow for a package to demand the minimum version of the NuGet client that can install it.&lt;/p&gt;

&lt;p&gt;Because this feature was added in version 2.5, older versions of NuGet won&amp;#8217;t be able to recognize it. Therefore, older clients will &lt;em&gt;always&lt;/em&gt; refuse to install packages with the MinClientVersion property set, even if you set it to a value smaller than the version of the client.&lt;/p&gt;

&lt;p&gt;For example, if you set MinClientVersion to 1.8, and the user tries to install your package with NuGet 2.2, the installation will fail even though 1.8 &amp;lt; 2.2. The user will see the following error message:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The schema version of &amp;#8216;MyPackage&amp;#8217; is incompatible with version 2.2.1.0 of NuGet. Please upgrade NuGet to the latest version from http://go.microsoft.com/fwlink/?LinkId=213942.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In sum, this feature will grow in its utility over future NuGet iterations, starting with version 2.6&lt;/p&gt;

&lt;p&gt;-Luan&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Support for Native Projects</title>
   <link href="http://blog.nuget.org/20130426/native-support.html"/>
   <updated>2013-04-26T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130426/native-support</id>
   <content type="html">&lt;p&gt;In the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-2.5'&gt;NuGet 2.5 release notes&lt;/a&gt;, we called out that NuGet now has support for native projects. We wanted to explain exactly what &amp;#8220;support for native projects&amp;#8221; means.&lt;/p&gt;

&lt;h2 id='visual_studio_support'&gt;Visual Studio Support&lt;/h2&gt;

&lt;p&gt;Until NuGet 2.5, if you were working in a Visual C++ project, the &amp;#8216;Manage NuGet Packages&amp;#8217; context menu would not show up for the project; with NuGet 2.5, we now light this up. Any time we start supporting a new project type, we have to test to ensure all operations are working as expected. Each project system has slightly different behavior and this proved to be true with Visual C++ as well. We made the changes necessary to get NuGet install/update/uninstall operations working.&lt;/p&gt;

&lt;h2 id='msbuild_integration'&gt;MSBuild Integration&lt;/h2&gt;

&lt;p&gt;C++ projects tend to have many different configurations&amp;#8211;more than what NuGet is able to handle. To address NuGet&amp;#8217;s configuration limitations, we are relying heavily on MSBuild properties and targets for native packages. These MSBuild properties and targets do the heavy lifting of providing references at build time, based on your project&amp;#8217;s configuration.&lt;/p&gt;

&lt;p&gt;To make MSBuild integration better, NuGet has created a new convention for automatically importing MSBuild properties and targets from a NuGet package. Alongside the existing \content, \lib, and \tools folders, NuGet now recognizes a new top-level folder: &lt;strong&gt;\build&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Within the \build folder, you can provide a &amp;#8220;.props&amp;#8221; file and/or a &amp;#8220;.targets&amp;#8221; file that will be automatically imported into the project. For this convention, the file name must match your package id with either a &amp;#8220;.props&amp;#8221; or &amp;#8220;.targets&amp;#8221; extension. For example, the &amp;#8217;&lt;a href='https://nuget.org/packages/cpprestsdk/'&gt;cpprestsdk&lt;/a&gt;&amp;#8217; package includes a &amp;#8216;cpprestsdk.targets&amp;#8217; file in its \build folder. Files with the &amp;#8220;.props&amp;#8221; extension will be imported at the top of the project file, and files with the &amp;#8220;.targets&amp;#8221; extension will be imported at the bottom of the project file.&lt;/p&gt;

&lt;p&gt;Note that this \build folder can be used for all NuGet packages and not just native packages. The \build folder respects target frameworks just like the \content, \lib, and \tools folders do. This means you can create a \build\net40 folder and a \build\net45 folder and NuGet will import the appropriate props and targets files into the project. You no longer need to write PowerShell install.ps1/uninstall.ps1 scripts to import MSBuild targets files!&lt;/p&gt;

&lt;h2 id='native_target_framework'&gt;Native Target Framework&lt;/h2&gt;

&lt;p&gt;When targeting native projects, a new target framework name is now recognized: &lt;strong&gt;native&lt;/strong&gt;. There is no versioning within the &amp;#8216;native&amp;#8217; target framework; NuGet treats all C++ projects the same.&lt;/p&gt;

&lt;p&gt;We expect that most native packages will be produced using the &lt;strong&gt;\build\native&lt;/strong&gt; folder, with at least a targets file and then a props file if needed. The &amp;#8216;native&amp;#8217; target framework is also recognized for the \content and \tools folders, but because NuGet cannot directly add references to native projects, the &amp;#8216;native&amp;#8217; target framework &lt;em&gt;is not&lt;/em&gt; recognized within the \lib folder.&lt;/p&gt;

&lt;h2 id='creating_native_packages'&gt;Creating Native Packages&lt;/h2&gt;

&lt;p&gt;If you’re interested in publishing your native libraries via NuGet, you can choose to create the NuGet packages manually. However, there’s an easier way&amp;#8211;the CoApp project volunteered to write C++ oriented tools to create NuGet packages, and they have &lt;a href='http://coapp.org/pages/releases.html'&gt;released a beta version&lt;/a&gt; of their tools. These tools simplify the process of generating the MSBuild files and NuGet packages from existing header and library files&amp;#8211;you just need to create a configuration script to describe the contents of the package and then run the tools to generate the NuGet package.&lt;/p&gt;

&lt;p&gt;There are &lt;a href='http://coapp.org/pages/tutorials.html'&gt;tutorials&lt;/a&gt;, &lt;a href='http://coapp.org/pages/reference.html'&gt;reference documentation&lt;/a&gt;, and a &lt;a href='https://www.youtube.com/watch?v=l4MAkR13JPA'&gt;video&lt;/a&gt; on how to use the tools to create NuGet packages. The CoApp project organizers also plan to create and publish packages for several open source libraries into the NuGet Gallery over the next several weeks.&lt;/p&gt;

&lt;p&gt;We’re encouraging people to publish packages with the &amp;#8220;native&amp;#8221; tag to make it easier to find packages you can use in C++ projects. You can search the NuGet Gallery using &amp;#8220;tag:native&amp;#8221; to find packages tagged with &amp;#8220;native&amp;#8221;. This works from both &lt;a href='https://nuget.org/packages?q=tag%3Anative'&gt;nuget.org&lt;/a&gt; and within Visual Studio. &lt;em&gt;Note that not all packages tagged with &amp;#8220;native&amp;#8221; are actually C++ projects though.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href='http://coapp.org/news/2013-04-26-Announcing-CoApp-Tools-For-NuGet.html'&gt;CoApp&lt;/a&gt; and &lt;a href='http://blogs.technet.com/b/openness/archive/2013/04/26/nuget-coapp-release.aspx'&gt;Openness@Microsoft&lt;/a&gt; blogs have additional information about this project.&lt;/p&gt;

&lt;h2 id='feedback'&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Please leave us feedback here on the blog&amp;#8211;we’d love to hear your experiences trying out NuGet in your C++ projects, and whether there are additional features we could add to make this work even better for you. This is just the start of C++ integration in NuGet and we need your input on where we should take this in the future to make working with C++ libraries in Visual Studio easier.&lt;/p&gt;

&lt;h2 id='related_links_and_announcements'&gt;Related Links and Announcements&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://blog.nuget.org/20130425/nuget-2.5-released.html'&gt;NuGet 2.5 Release Announcement&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://nuget.codeplex.com/releases/view/96733'&gt;NuGet 2.5 Download Page&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://coapp.org/releases'&gt;CoApp&amp;#8217;s PowerShell Tools Installer to create NuGet packages for C++ libraries and tools&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://blogs.msdn.com/b/vcblog/archive/2013/04/26/nuget-for-c.aspx'&gt;Announcement on the Visual C++ Team Blog&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://blogs.technet.com/b/openness/archive/2013/04/26/nuget-coapp-release.aspx'&gt;Announcement on the Openness@Microsoft Blog&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://coapp.org/news/2013-04-26-Announcing-CoApp-Tools-For-NuGet.html'&gt;Announcement on the CoApp Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet 2.5 Released</title>
   <link href="http://blog.nuget.org/20130425/nuget-2.5-released.html"/>
   <updated>2013-04-25T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130425/nuget-2.5-released</id>
   <content type="html">&lt;h2 id='download_it_now'&gt;Download it now&lt;/h2&gt;

&lt;p&gt;NuGet was included in all editions of Visual Studio 2012 and it&amp;#8217;s also available for Visual Studio 2010 through the Visual Studio Extension Manager. To get the latest version of NuGet installed in Visual Studio, either check for updates in the extension manager or &lt;a href='http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c'&gt;download the latest version directly&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='acknowledgements'&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;We would like to thank the following external contributors for their significant contributions to NuGet 2.5:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/dsplaisted'&gt;Daniel Plaisted (dsplaisted)&lt;/a&gt; - Add MonoAndroid, MonoTouch, and MonoMac to the list of known target framework identifiers. &lt;a href='https://nuget.codeplex.com/workitem/2847'&gt;#2847&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/knocte'&gt;Andres G. Aragoneses (knocte)&lt;/a&gt; - Fix spelling of NuGet.targets for a case-sensitive OS &lt;a href='https://nuget.codeplex.com/workitem/2865'&gt;#2865&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/dfowler'&gt;David Fowler (dfowler)&lt;/a&gt; - Make the solution build on Mono.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/atheken'&gt;Andrew Theken (atheken)&lt;/a&gt; - Fix unit tests failing on Mono.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/OliIsCool'&gt;Olivier Dagenais (OliIsCool)&lt;/a&gt; - nuget.exe pack command does not propagate Properties to msbuild &lt;a href='https://nuget.codeplex.com/workitem/2920'&gt;#2920&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/MiroslavBajtos'&gt;Miroslav Bajtos (MiroslavBajtos)&lt;/a&gt; - Modified XML handling code to preserve formatting. &lt;a href='https://nuget.codeplex.com/workitem/1511'&gt;#1511&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/adamralph'&gt;Adam Ralph (adamralph)&lt;/a&gt; - Added recognized words to custom dictionary to allow build.cmd to succeed.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/broggeri'&gt;Bruno Roggeri (broggeri)&lt;/a&gt; - Fix unit tests when running in localized VS.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/garethevans'&gt;Gareth Evans (garethevans)&lt;/a&gt; - Extracted interface from PackageService&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/brugidou'&gt;Maxime Brugidou (brugidou)&lt;/a&gt; - Handle project dependencies when packing &lt;a href='https://nuget.codeplex.com/workitem/936'&gt;#936&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/XavierDecoster'&gt;Xavier Decoster (XavierDecoster)&lt;/a&gt; - Support Clear Text Password when storing package source credentials in nuget.cofig files &lt;a href='https://nuget.codeplex.com/workitem/2991'&gt;#2991&lt;/a&gt;, &lt;a href='https://nuget.codeplex.com/workitem/3164'&gt;#3164&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We also appreciate the following individuals for finding bugs with NuGet 2.5 Beta/RC that were approved and fixed before the final release:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href='https://www.codeplex.com/site/users/view/CodeChief'&gt;Tony Wall (CodeChief)&lt;/a&gt; - MSTest broken with lastest NuGet 2.4 and 2.5 builds &lt;a href='https://nuget.codeplex.com/workitem/3200'&gt;#3200&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='whats_included_in_nuget_25'&gt;What&amp;#8217;s Included in NuGet 2.5&lt;/h2&gt;

&lt;p&gt;This release was so big, we felt compelled to skip versions 2.3 and 2.4! To date, this is the largest release we&amp;#8217;ve had for NuGet, with &lt;a href='https://nuget.codeplex.com/workitem/list/advanced?release=NuGet%202.5&amp;amp;status=all'&gt;169 work items&lt;/a&gt; in the release.&lt;/p&gt;

&lt;p&gt;For details about what&amp;#8217;s in the release, the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-2.5'&gt;release notes&lt;/a&gt; are published on &lt;a href='http://docs.nuget.org'&gt;docs.nuget.org&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='here_are_the_most_notable_features'&gt;Here are the most notable features:&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Allow users to overwrite content files that already exist&lt;/li&gt;

&lt;li&gt;Automatic import of msbuild targets and props files&lt;/li&gt;

&lt;li&gt;Specify different references per platform using &lt;References /&gt; element&lt;/li&gt;

&lt;li&gt;Update All button to allow updating all packages at once&lt;/li&gt;

&lt;li&gt;Improved project reference support for NuGet.exe Pack&lt;/li&gt;

&lt;li&gt;Add a &amp;#8216;Minimum NuGet Version&amp;#8217; property to packages&lt;/li&gt;

&lt;li&gt;Dependencies are no longer unnecessarily updated during package installation&lt;/li&gt;

&lt;li&gt;NuGet.exe outputs http requests with detailed verbosity&lt;/li&gt;

&lt;li&gt;NuGet.exe push now supports UNC and directory sources&lt;/li&gt;

&lt;li&gt;NuGet.exe supports explicitly-specified Config files&lt;/li&gt;

&lt;li&gt;Support for Native projects&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='nugets_description'&gt;NuGet&amp;#8217;s description&lt;/h2&gt;

&lt;p&gt;We&amp;#8217;ve outgrown NuGet&amp;#8217;s current description. According to &lt;a href='http://nuget.org'&gt;nuget.org&lt;/a&gt;, we have the following description and slogan:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Jump Start Your Projects with NuGet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NuGet is a Visual Studio extension that makes it easy to install and update third-party libraries and tools in Visual Studio.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So install NuGet and get a jump on your next project!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have come up with a new description for NuGet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NuGet is the package manager for the Microsoft development platform including .NET. The NuGet client tools provide the ability to produce and consume packages. The NuGet Gallery (&lt;a href='http://nuget.org'&gt;nuget.org&lt;/a&gt;) is the central package repository used by all package authors and consumers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can expect the home page at &lt;a href='http://nuget.org'&gt;nuget.org&lt;/a&gt; to reflect this new description soon.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>XDT web.config transforms</title>
   <link href="http://blog.nuget.org/20130422/xdt-web-config-transforms.html"/>
   <updated>2013-04-22T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130422/xdt-web-config-transforms</id>
   <content type="html">&lt;p&gt;Sitting there since October 12, 2010, with a total of 55 votes accumulated since then, there&amp;#8217;s a NuGet feature that has had more than its fair share of attention: &lt;a href='https://nuget.codeplex.com/workitem/232'&gt;Support Visual Studio (XDT) Web.config Transforms&lt;/a&gt;. It&amp;#8217;s the 17th highest voted work item of all time for NuGet, and the 5th highest voted &lt;em&gt;open&lt;/em&gt; work item. Today, we are announcing that we are finally unblocked on getting this feature integrated into NuGet!&lt;/p&gt;

&lt;p&gt;Last November, we made the decision to act on this feature request, and Luan Nguyen (&lt;a href='https://www.codeplex.com/site/users/view/dotnetjunky'&gt;dotnetjunky&lt;/a&gt;) posted a &lt;a href='https://nuget.codeplex.com/discussions/405195'&gt;discussion thread&lt;/a&gt; that NuGet would be taking a dependency on the XDT assembly. Within a few hours, Andreas Håkansson (&lt;a href='https://www.codeplex.com/site/users/view/thecodejunkie'&gt;thecodejunkie&lt;/a&gt;) pointed out a really good glitch in our plan: we needed to make sure the feature would work on Mono!&lt;/p&gt;

&lt;p&gt;Fast forward 4 months, and we have resolution for the requirement of XDT support working on Mono&amp;#8211;Microsoft has open-sourced the XML Document Transform (XDT) library at &lt;a href='http://xdt.codeplex.com'&gt;http://xdt.codeplex.com&lt;/a&gt;, and NuGet will be taking a source dependency on XDT rather than a binary dependency.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the net result of the work we&amp;#8217;ve done with the team that develops the XDT library:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;a href='http://nuget.org/packages/Microsoft.Web.Xdt/'&gt;Microsoft.Web.Xdt&lt;/a&gt; NuGet package is published to nuget.org.&lt;/li&gt;

&lt;li&gt;The NuGet team used that NuGet package to prototype integration of NuGet and XDT.&lt;/li&gt;

&lt;li&gt;The XDT library is open-sourced (not accepting contributions) at &lt;a href='http://xdt.codeplex.com'&gt;xdt.codeplex.com&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;The NuGet team will now use the XDT source to provide the integration.&lt;/li&gt;

&lt;li&gt;This allows all NuGet users on all platforms to use the feature. NuGet can be built on Mono and have the XDT source built there too.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;NuGet package authors will be able to create two new files in their packages to perform XDT transforms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;web.config.install.xdt (and yes, files other than web.config are supported)&lt;/li&gt;

&lt;li&gt;web.config.uninstall.xdt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These files can use XDT functionality to transform XML files during install, and then to reverse the transformations upon uninstall. It&amp;#8217;s a concept very similar to install.ps1/uninstall.ps1, but using the XDT library for the XML transforms.&lt;/p&gt;

&lt;p&gt;We are working on the source-based integration of this feature now, and we plan to include it in the NuGet 2.6 release in early summer 2013.&lt;/p&gt;

&lt;p&gt;For more information about the XDT library and its open source project, check out the &lt;a href='http://blogs.msdn.com/b/webdev/archive/2013/04/23/xdt-xml-document-transform-released-on-codeplex-com.aspx'&gt;.NET Web Development and Tools blog post&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Goodbye preview.nuget.org. Hello staging.nuget.org!</title>
   <link href="http://blog.nuget.org/20130419/goodbye-preview.html"/>
   <updated>2013-04-19T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130419/goodbye-preview</id>
   <content type="html">&lt;p&gt;&lt;a href='http://en.wiktionary.org/wiki/TL;DR'&gt;TL;DR&lt;/a&gt; The &lt;a href='http://preview.nuget.org'&gt;preview.nuget.org&lt;/a&gt; site is going away. Switch to &lt;a href='http://staging.nuget.org'&gt;staging.nuget.org&lt;/a&gt; by April 26th!&lt;/p&gt;

&lt;h2 id='goodbye_previewnugetorg'&gt;Goodbye preview.nuget.org&lt;/h2&gt;

&lt;p&gt;We have a version of the NuGet Gallery called &amp;#8220;Preview&amp;#8221; and it&amp;#8217;s been hosted at &lt;a href='http://preview.nuget.org'&gt;preview.nuget.org&lt;/a&gt; since early in the Gallery&amp;#8217;s lifetime. Until recently, our QA team used preview.nuget.org to do their testing, but we&amp;#8217;ve also occasionally advised package owners to use the site as a sandbox environment. Over time, this has put us in the situation of the &amp;#8220;preview&amp;#8221; site serving two different purposes: 1) it was an internal QA testing environment, and 2) it was a customer sandbox/preview environment.&lt;/p&gt;

&lt;p&gt;These two use cases for the environment have drastically different requirements. The QA environment needs to be sanitized to not have any real data and allow the QA team to do whatever they need to the data at any time. The customer sandbox environment needs to have a mirror of recent production data to provide a useful staging environment. Because of these conflicting requirements, we are separating our QA testing environment from the sandbox, and &lt;strong&gt;we&amp;#8217;ll be decommisioning preview.nuget.org on April 26th&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id='hello_stagingnugetorg'&gt;Hello staging.nuget.org&lt;/h2&gt;

&lt;p&gt;To provide a sandbox where package authors can stage their packages to test their publishing, we are creating a new staging environment at &lt;a href='http://staging.nuget.org'&gt;staging.nuget.org&lt;/a&gt;. Staging is a very close mirror of production and its data is frequently copied from production (although not yet on any fixed schedule).&lt;/p&gt;

&lt;p&gt;If you have packages you want to publish and you&amp;#8217;re nervous about the publishing process, please use &lt;a href='http://staging.nuget.org'&gt;staging.nuget.org&lt;/a&gt;. Your account information and API key are not guaranteed to be in sync because the data is not a live mirror, but you can register and log on to Staging just like you would on &lt;a href='http://nuget.org'&gt;http://nuget.org&lt;/a&gt;. You can then push your packages to Staging and ensure you have your publishing process and your package metadata just right before publushing to &lt;a href='http://nuget.org'&gt;nuget.org&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet 2.5 Release Candidate</title>
   <link href="http://blog.nuget.org/20130415/nuget-2.5-release-candidate.html"/>
   <updated>2013-04-15T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130415/nuget-2.5-release-candidate</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Updated:&lt;/em&gt; The NuGet 2.5 Release Candidate was available from April 15 to April 25, 2013. For the several hundred of you that downloaded the release candidate, we truly appreciate your verification of the RC build that became the final release.&lt;/p&gt;

&lt;h2 id='whats_included_in_nuget_25'&gt;What&amp;#8217;s Included in NuGet 2.5&lt;/h2&gt;

&lt;p&gt;This release was so big, we felt compelled to skip versions 2.3 and 2.4! To date, this is the largest release we&amp;#8217;ve had for NuGet, with over &lt;a href='https://nuget.codeplex.com/workitem/list/advanced?release=NuGet%202.5&amp;amp;status=all'&gt;160 work items&lt;/a&gt; in the release.&lt;/p&gt;

&lt;p&gt;For details about what&amp;#8217;s in the release, the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-2.5'&gt;tentative release notes&lt;/a&gt; have been published to &lt;a href='http://docs.nuget.org'&gt;docs.nuget.org&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='here_are_the_most_notable_features'&gt;Here are the most notable features:&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Allow users to overwrite content files that already exist&lt;/li&gt;

&lt;li&gt;Automatic import of msbuild targets and props files&lt;/li&gt;

&lt;li&gt;Specify different references per platform using &lt;References /&gt; element&lt;/li&gt;

&lt;li&gt;Update All button to allow updating all packages at once&lt;/li&gt;

&lt;li&gt;Improved project reference support for NuGet.exe Pack&lt;/li&gt;

&lt;li&gt;Add a &amp;#8216;Minimum NuGet Version&amp;#8217; property to packages&lt;/li&gt;

&lt;li&gt;Dependencies are no longer unnecessarily updated during package installation&lt;/li&gt;

&lt;li&gt;NuGet.exe outputs http requests with detailed verbosity&lt;/li&gt;

&lt;li&gt;NuGet.exe push now supports UNC and directory sources&lt;/li&gt;

&lt;li&gt;NuGet.exe supports explicitly-specified Config files&lt;/li&gt;

&lt;li&gt;Support for Native projects&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='nugets_description_and_slogan'&gt;NuGet&amp;#8217;s description and slogan&lt;/h2&gt;

&lt;p&gt;We think we&amp;#8217;ve outgrown NuGet&amp;#8217;s current description. According to &lt;a href='http://nuget.org'&gt;nuget.org&lt;/a&gt;, we have the following description and slogan:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Jump Start Your Projects with NuGet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NuGet is a Visual Studio extension that makes it easy to install and update third-party libraries and tools in Visual Studio.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So install NuGet and get a jump on your next project!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have come up with a new description for NuGet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NuGet is the open-source package manager for the Microsoft platform and .NET/Mono. The NuGet client tools provide the ability to produce and consume packages. The NuGet Gallery (nuget.org) is the central package repository used by all package authors and consumers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We&amp;#8217;d like your feedback on this new description. And for a new slogan to replace &amp;#8220;Jump Start Your Projects with NuGet,&amp;#8221; we&amp;#8217;re still undecided. We want something fun and maybe a little edgy. If you&amp;#8217;d like to submit your idea, tweet your idea using the &lt;a href='https://twitter.com/search/realtime?q=%23nugetslogan'&gt;#nugetslogan&lt;/a&gt; hashtag. Once we have a good list to choose from, we&amp;#8217;ll open up a poll. Follow &lt;a href='http://twitter.com/nuget'&gt;@nuget&lt;/a&gt; for updates.&lt;/p&gt;
&lt;a href='https://twitter.com/search?q=%23nugetslogan' class='twitter-timeline' data-widget-id='323970527691685888' data-dnt='true'&gt;Tweets about &quot;#nugetslogan&quot;&lt;/a&gt;&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+&quot;://platform.twitter.com/widgets.js&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;twitter-wjs&quot;);&lt;/script&gt;</content>
 </entry>
 
 <entry>
   <title>Recent NuGet Gallery Updates</title>
   <link href="http://blog.nuget.org/20130411/recent-nuget-gallery-updates.html"/>
   <updated>2013-04-11T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130411/recent-nuget-gallery-updates</id>
   <content type="html">&lt;p&gt;The NuGet Gallery crew has gotten into a rhythm of publishing updates every 2 weeks. With the increased update frequency, we found that we needed to create a changelog to highlight new features. That changelog is now available directly from within our &lt;a href='https://github.com/NuGet/NuGetGallery'&gt;source repository on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can access the changelog directly here: &lt;a href='https://github.com/NuGet/NuGetGallery/blob/master/Changelog.md'&gt;https://github.com/NuGet/NuGetGallery/blob/master/Changelog.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the current log, showing the changes that have been made over the last 2 deployments.&lt;/p&gt;

&lt;h2 id='april_4_2013'&gt;April 4, 2013&lt;/h2&gt;

&lt;h3 id='top_500_packages_exposed_in_the_feed'&gt;Top 500 packages exposed in the feed&lt;/h3&gt;

&lt;p&gt;The nuget.org API (V2) feed now exposes the top downloaded packages (over the last 6 weeks). This can accessed be via url &lt;a href='//nuget.org/api/v2/stats/downloads'&gt;nuget.org/api/v2/stats/downloads&lt;/a&gt;. At this time, the top 500 packages are shown by default and that is also the maximum number returned.&lt;/p&gt;

&lt;p&gt;You can limit the numbers of results using ?count in the query string. For example, &lt;a href='//nuget.org/api/v2/stats/downloads?count=10'&gt;nuget.org/api/v2/stats/downloads?count=10&lt;/a&gt; would return the top 10 downloaded packages in last 6 weeks - with information like download count, gallery url and feed url for that package.&lt;/p&gt;

&lt;p&gt;The default and maximum count of 500 might change over time, so we recommend always specifying a count parameter if you are programmatically consuming this data.&lt;/p&gt;

&lt;h3 id='numeric_rank_for_packages_stats'&gt;Numeric rank for packages stats&lt;/h3&gt;

&lt;p&gt;The &lt;a href='http://nuget.org/stats'&gt;Statistics page&lt;/a&gt; now shows the numeric rank of the package (based on the download count).&lt;/p&gt;

&lt;h3 id='links_to_gravatar_in_profile_page'&gt;Links to gravatar in profile page&lt;/h3&gt;

&lt;p&gt;The profile editing page now includes help text and a link to gravatar making it easy for users to update their profile picture.&lt;/p&gt;

&lt;h3 id='username_optimization_in_db_backend'&gt;UserName optimization in DB (backend)&lt;/h3&gt;

&lt;p&gt;The &amp;#8220;Users&amp;#8221; table is optimized to have &amp;#8220;UserName&amp;#8221; as index for performance enhancements.&lt;/p&gt;

&lt;h3 id='other_minor_bug_fixes'&gt;Other minor bug fixes&lt;/h3&gt;

&lt;p&gt;Complete list can be found here: &lt;a href='https://github.com/NuGet/NuGetGallery/issues?milestone=18&amp;amp;state=closed'&gt;Production Deployment 4/12&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='march_28_2013'&gt;March 28, 2013&lt;/h2&gt;

&lt;h3 id='support_for_minclientversion'&gt;Support for MinClientVersion&lt;/h3&gt;

&lt;p&gt;You can now upload packages with &amp;#8221;&lt;a href='http://nuget.codeplex.com/wikipage?title=NuGet%202.5%20list%20of%20features%20for%20Testing%20days%203%2f27%20to%203%2f29%20%2c%202013'&gt;minclientVersion&lt;/a&gt;&amp;#8221; to the NuGetGallery.&lt;/p&gt;

&lt;p&gt;The minclientVersion of the package will shown in the package home page right next to the package description.&lt;/p&gt;

&lt;h3 id='contacting_support'&gt;Contacting support&lt;/h3&gt;

&lt;p&gt;The &amp;#8220;Report Abuse&amp;#8221; page has been revamped to enable users to chose the specific issue with the package they are reporting. It also guides the user to differentiate between &amp;#8220;Contact Owners&amp;#8221; and &amp;#8220;Report Abuse&amp;#8221;.&lt;/p&gt;

&lt;h3 id='improved_package_statistics'&gt;Improved package statistics&lt;/h3&gt;

&lt;p&gt;The package statistics now shows the break down of downloads based on the NuGet client (like NuGet CommandLine 2.1, NuGet Package Manager console 2.2 and so on. It also shows the split of the type of download operation (like Install, Restore, Update).&lt;/p&gt;

&lt;h3 id='other_minor_bug_fixes'&gt;Other minor bug fixes&lt;/h3&gt;

&lt;p&gt;Complete list can be found here: &lt;a href='https://github.com/NuGet/NuGetGallery/issues?milestone=17&amp;amp;state=closed'&gt;Production Deployment 3/28&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The March 6th NuGet Gallery Outage</title>
   <link href="http://blog.nuget.org/20130404/the-march-6-nuget-gallery-outage.html"/>
   <updated>2013-04-04T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130404/the-march-6-nuget-gallery-outage</id>
   <content type="html">&lt;p&gt;On March 6th 2013, nuget.org&amp;#8217;s package download was broken for one and a half hours. Some outages involve factors beyond our control; this time it was very much our own fault and we would like to apologize. We also want to openly discuss the outage and reassure you that we are working on preventing reoccurences.&lt;/p&gt;

&lt;h2 id='timeline_of_events'&gt;Timeline of events&lt;/h2&gt;

&lt;p&gt;The outage was triggered by the NuGet Gallery crew performing a regular planned upgrade to nuget.org. We had successfully completed the previous production upgrade as recently as 2 weeks prior (in fact we are now shipping code to nuget.org on regular 2-3 weeks intervals). The timeline of the outage was something like this:&lt;/p&gt;

&lt;p&gt;2:00 - We assembled to do deployment to production. Following our existing process, we backed up the production database, reviewed the state of our master branch in git, and checked that our preproduction environment still looked healthy.&lt;/p&gt;

&lt;p&gt;2:25 - We published the new code to the Production Web Role in Azure staging slots. Because we are using Entity Framework migrations at App Startup time, and because the VMs in staging slots run against the same database as the (still live) VMs in production slots, we did not feel safe testing these new role instances prior to doing the VIP swap which brings the new code live.&lt;/p&gt;

&lt;p&gt;2:30 - We do the VIP swap, and the new code is now running nuget.org. We start doing sanity tests of production, and checking the error logs in case we will see evidence of any problems there.&lt;/p&gt;

&lt;p&gt;A few minutes later, we started receiving tweets and emails stating that package downloads were failing. We acknowledged the issue on twitter. &lt;a href='https://twitter.com/nuget/status/309432341057634305'&gt;Related tweet&lt;/a&gt;. We really appreciate your tweets at &lt;a href='http://twitter.com/nuget'&gt;@nuget&lt;/a&gt; when you encounter site issues!&lt;/p&gt;

&lt;p&gt;2:35 - We realized gallery is redirecting package download requests to package URLs that don&amp;#8217;t exist. We also realized why. The problem is in our production environment package blobs have not been updated to the new naming convention that the new code we just deployed requires.&lt;/p&gt;

&lt;p&gt;We started running the batch job, which already exists, and has been used on preproduction environments. This will update the production environment package blobs and fix package downloads so the world can get their nupkgs. We estimated that this batch job will take 40-60 minutes to run.&lt;/p&gt;

&lt;p&gt;While we monitored the progress of the batch job, we were simultaneously second guessing ourselves and trying to think of a safe way to get the site back up faster. Unfortunately VIP swapping back to the old production VMs is not a viable solution, the reason again being the way we are using Entity Framework migrations at App_Start which means our old production code is probably not going to be happy with a database which is in a state it does not understand.&lt;/p&gt;

&lt;p&gt;2:40 - We got worried. The batch job seemed to be working very slowly, or not at all.&lt;/p&gt;

&lt;p&gt;3:05 - We realized the batch job itself is broken. We fixed the code, and restarted the whole batch job. Again we monitored progress of the batch job. This time, eventually, we could verify it was working properly. We thought the batch job would take about an hour to complete, but it ended up taking 85 minutes. Packages gradually became available for download during this time, so some people may have seen their problems resolved sooner. &lt;a href='https://twitter.com/nuget/status/309439911881240577'&gt;Related tweet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;4:30 - We verified that the batch job had completed and all packages are back up and working. &lt;a href='https://twitter.com/nuget/status/309461232967110656'&gt;Related tweet&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='the_problematic_code_changes'&gt;The Problematic Code Changes&lt;/h2&gt;

&lt;p&gt;Here&amp;#8217;s what motivated the change causing all these problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Package IDs in URLs on the nuget gallery are case insensitive.&lt;/li&gt;

&lt;li&gt;Azure Blob Storage, which we use for holding all our nupkg files for download, is case sensitive.&lt;/li&gt;

&lt;li&gt;Package IDs have their &amp;#8216;canonical&amp;#8217; casing preserved in the NuGet database, and is used to build the filename that retrieves the blob from blob storage.&lt;/li&gt;

&lt;li&gt;The canonical casing is determined the &lt;em&gt;first&lt;/em&gt; time the package is published and it was immutable. Many package authors have wished to change the casing, but we couldn&amp;#8217;t support it. This meant that any given version of a package might claim a package ID that is different from the canonical ID.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The consequence of 3. and 4. is that in order to service a package restore download request, which contains the package ID in casing which may be different from blob storage, nuget.org must query the database to retrieve the canonical ID before we could service the download request. As a further consequence package download stops working any time our database goes down.&lt;/p&gt;

&lt;h3 id='avoiding_the_database_for_package_downloads'&gt;Avoiding the database for package downloads&lt;/h3&gt;

&lt;p&gt;We updated the code that handles package download requests to look for packageID.ToLowerCase(); This means we no longer have to hit the database to retrieve package ID&amp;#8217;s canonically cased version, we can just use ToLowerCase() on the package ID sent in the download request.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We apologize for the irony! We intended package downloads to become more robust but actually ended up breaking package downloads.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id='the_postmortem__what_went_wrong'&gt;The Postmortem - What Went Wrong&lt;/h2&gt;

&lt;p&gt;We held a meeting the day after the outage, where we did a break-down starting with a summary of everything that went wrong, during the upgrade and outage. Here&amp;#8217;s &lt;em&gt;what&lt;/em&gt; went wrong.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The outage happened. We published a problem code to the VMs without the required associated data because we are missing a step in the deployment.&lt;/li&gt;

&lt;li&gt;We tested the production environment after we published the code. This is when we discovered the issue. The time spent testing and discovering the issue contributes to the total delay between the problem occurring and us fixing the problem.&lt;/li&gt;

&lt;li&gt;We were not confident we could safely revert the VIP swap to unpublish from production. If we could have done it then package downloads would have started working immediately, and it would have been probably a 5 minute downtime, not a 1.5 hour downtime. So our inability to safely revert is a problem.&lt;/li&gt;

&lt;li&gt;The batch job for fixing the problem failed the first time. It contributed to the outage duration significantly the time to realize the script was broken and fix it again was 20 minutes or more.&lt;/li&gt;

&lt;li&gt;And finally, the missed step of running the fixed batch job to recover the gallery just takes a long time because it&amp;#8217;s doing a lot of work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In a deeper analysis of &lt;em&gt;how&lt;/em&gt; the problem code went into production in the first place without knowing that it would cause a problem, we found out that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The script had been run against our QA environment (called Preview) &lt;em&gt;by the developer&lt;/em&gt;, without involving QA in testing the script.&lt;/li&gt;

&lt;li&gt;The script had not been run against the preproduction environment (called Staging) ever. One reason for that is that Preview and Staging share the same Azure blob storage account, so it would have made no difference to observable behavior during testing.&lt;/li&gt;

&lt;li&gt;Even though the need for running the script had been communicated verbally to the crew, because it was weeks earlier and because the step was not part of the deployment process for Preview and Staging, the step was completely forgotten about by the time it came to do the actual production deployment.&lt;/li&gt;

&lt;li&gt;QA team had noticed issues downloading from Preview and Staging environments but not realize they were important because it was &lt;em&gt;normal for download to be broken in these environments&lt;/em&gt;. The reason is these environments don&amp;#8217;t have the full set of the production blob data in their own storage account.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='conclusions__what_we_plan_to_change'&gt;Conclusions - What We Plan to Change&lt;/h2&gt;

&lt;p&gt;Plans for preventing and mitigating future nuget.org downtime caused by the NuGet gallery crew&amp;#8217;s upgrades to nuget.org.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ensure our deployment checklist of ALL steps required for deployment is updated alongside any code changes that require special deployment steps.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Validate production deployments using automated tests immediately after going live. We want to be able to detect the problems faster than it can be tweeted to us.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Expect problems during upgrades, and have a clear recovery plan in place for every deployment. The plan details how to quickly and safely recover when the deployment fails.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideally our recovery plan should always be VIP swap. We are currently experimenting with changing our use of Entity Framework to a model which will not depend on running migrations during the deployment itself.&lt;/p&gt;

&lt;p&gt;A second recovery plan is database restore &lt;em&gt;plus&lt;/em&gt; VIP swap. We would first set the Gallery to Read-Only mode (this is new) during the deployment, which means you will be unable to create accounts and upload packages while the deployment occurs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Test&lt;/em&gt; the recovery plan in preproduction before doing the production deployment. (Confidence in a plan that has been dreamed up under pressure and not been tested is low!)&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;We need to make the QA and Preproduction environments squeaky clean and as reliable as production. We should never have issues that occur there that get ignored and thereby slip into production.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Stopping Preview and Staging from sharing the blob storage account will help us ensure we have done clean practice deployments.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Enhance our service monitoring to give us better feedback on when and how package download gets broken.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Improved search syntax on nuget.org and in NuGet Visual Studio extension</title>
   <link href="http://blog.nuget.org/20130325/improved-search-syntax.html"/>
   <updated>2013-03-25T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20130325/improved-search-syntax</id>
   <content type="html">&lt;p&gt;The NuGet team recently deployed a new and very useful search capability on nuget.org, which allows you to narrow your search to a pariticular attribute of a NuGet package. For example, if you want to search for packages which contain &amp;#8216;elmah&amp;#8217; within the Id, you type &amp;#8217;&lt;strong&gt;&lt;a href='https://nuget.org/packages?q=id%3Aelmah' title='Search for packages with elmah in Id'&gt;id:elmah&lt;/a&gt;&lt;/strong&gt;&amp;#8217;. (Note that this will execute a &amp;#8216;contains&amp;#8217; search, not an exact match search. Which means it will return elmah, elmah.corelibrary, etc.)&lt;/p&gt;

&lt;p&gt;Similarly you can use the same syntax to search for other attributes in the package metadata. Here&amp;#8217;s the complete list of supported attributes:&lt;/p&gt;
&lt;table border='1' cellpadding='8'&gt;
   &lt;thead&gt;
      &lt;tr&gt;
         &lt;td&gt;Attribute&lt;/td&gt;
         &lt;td&gt;Example&lt;/td&gt;
      &lt;/tr&gt;
   &lt;/thead&gt;

   &lt;tbody&gt;
      &lt;tr&gt;
         &lt;td&gt;id&lt;/td&gt;
         &lt;td&gt;&lt;strong&gt;id:jQuery&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
	  &lt;tr&gt;
         &lt;td&gt;title&lt;/td&gt;
         &lt;td&gt;&lt;strong&gt;title:Validation&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;description&lt;/td&gt;
         &lt;td&gt;&lt;strong&gt;description:dependency injection&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;authors&lt;/td&gt;
         &lt;td&gt;&lt;strong&gt;authors:Outercurve Foundation&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;owners&lt;/td&gt;
         &lt;td&gt;&lt;strong&gt;owners:dotnetjunky&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
         &lt;td&gt;tags&lt;/td&gt;
         &lt;td&gt;&lt;strong&gt;tags:silverlight&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Note that when a search query contains spaces, the gallery will perform an OR search against words in the query. AND search is currently not supported.&lt;/p&gt;

&lt;p&gt;Even better, this feature is automatically available for any NuGet client that calls the Search service method from nuget.org. This can be seen in the Visual Studio Package Manager dialog as shown below.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/improved-search.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Happy searching!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Introducing Package Statistics</title>
   <link href="http://blog.nuget.org/20130226/Introducing-Package-Statistics.html"/>
   <updated>2013-02-26T00:00:00-08:00</updated>
   <id>http://blog.nuget.org/20130226/Introducing-Package-Statistics</id>
   <content type="html">&lt;p&gt;We have introduced a new feature on &lt;a href='http://nuget.org'&gt;http://nuget.org&lt;/a&gt; where you can see download statistics for packages. With this initial drop, we hope to whet your appetite and collect your input on further statistics features; it&amp;#8217;s a mere fraction of what we can imagine.&lt;/p&gt;

&lt;h2 id='statistics_tab'&gt;Statistics Tab&lt;/h2&gt;

&lt;p&gt;At the top of the site, a new &amp;#8216;Statistics&amp;#8217; tab is displayed.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/2013-02-26-Introducing-Package-Statistics/statistics-tab.png' alt='statistics tab' /&gt;&lt;/p&gt;

&lt;p&gt;This tab takes you to &lt;a href='http://nuget.org/stats'&gt;http://nuget.org/stats&lt;/a&gt;, which shows the two high-level statistics reports we have at the moment. While we expect this page will expand with more reports, the first two we&amp;#8217;ve introduced are &amp;#8220;Downloaded Packages (Last 6 Weeks)&amp;#8221; and &amp;#8220;Downloaded Package Versions (Last 6 Weeks).&amp;#8221;&lt;/p&gt;

&lt;h2 id='downloaded_packages'&gt;Downloaded Packages&lt;/h2&gt;

&lt;p&gt;This report shows the total download numbers for all versions of a package. The full report includes the top 100 packages over the last 6 weeks. It&amp;#8217;s no shock that packages like jQuery, Newtonsoft.Json, jQuery.Validation, and Microsoft.AspNet.Razor are at the top. But since the report is based on the last 6 weeks, instead of all time, we expect to see more changes on this report than on the full list of packages.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/2013-02-26-Introducing-Package-Statistics/downloaded-packages.png' alt='downloaded packages' /&gt;&lt;/p&gt;

&lt;h2 id='downloaded_package_versions'&gt;Downloaded Package Versions&lt;/h2&gt;

&lt;p&gt;This report shows the download numbers for a single version of a package. This full report includes the top 500 package versions over the last 6 weeks, and a package can show up multiple times if it has had more than one frequently downloaded version. From here, we can learn more about which versions of packages developers are using and how long it takes a new version to overcome an older one.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/2013-02-26-Introducing-Package-Statistics/downloaded-package-versions.png' alt='downloaded package versions' /&gt;&lt;/p&gt;

&lt;h2 id='version_breakdown_for_a_package'&gt;Version Breakdown for a Package&lt;/h2&gt;

&lt;p&gt;On the &amp;#8216;Downloaded Packages&amp;#8217; report, the download count is a hyperlink. Following that hyperlink for a package will show you a report for the package&amp;#8217;s downloads by version. This package-specific report lets you see the recent (6 weeks) downloads for any package, to further identify download trends for a package&amp;#8217;s versions.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/2013-02-26-Introducing-Package-Statistics/version-breakdown.png' alt='version breakdown' /&gt;&lt;/p&gt;

&lt;h2 id='statistics_for_any_package'&gt;Statistics for any Package&lt;/h2&gt;

&lt;p&gt;When viewing the detail page for any package, there&amp;#8217;s a new &amp;#8216;Package Statistics&amp;#8217; link on the left side. This link takes you directly to the version breakdown for that package, showing the download statistics for the last 6 weeks. This data will be different from the download counts displayed directly on the package page, where that is a total of downloads for all time, instead of just the last 6 weeks.&lt;/p&gt;

&lt;p&gt;Note that there are not any reports visible only to the package owner. Everyone can see the package statistics for any package.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/2013-02-26-Introducing-Package-Statistics/package-statistics.png' alt='package statistics' /&gt;&lt;/p&gt;

&lt;h2 id='availability'&gt;Availability&lt;/h2&gt;

&lt;p&gt;As we first launch the package statistics feature, many packages will not have statistics available right away. You may see a message that states, &amp;#8220;Download statistics are not currently available for this package, please check back later.&amp;#8221; After the deployment of the feature, we are firing off the job to produce statistics reports for all packages. We expect this to take about a day. So if your package&amp;#8217;s statistics aren&amp;#8217;t yet available, just check back again later.&lt;/p&gt;

&lt;p&gt;After the initial release of the feature, there will be a job running nightly to refresh every package&amp;#8217;s statistics reports.&lt;/p&gt;

&lt;h2 id='feedback_and_input'&gt;Feedback and Input&lt;/h2&gt;

&lt;p&gt;As mentioned, this is just the beginning of package statistics. We expect other reports to highlight which NuGet operation caused the download, whether it was a fresh Install, an Update, or a Package Restore. We are now collecting that data and in a handful of weeks we&amp;#8217;ll be able to report on it. We also expect reports that bring in dependency graph data, packages that have been recently updated, and more.&lt;/p&gt;

&lt;p&gt;If you have feedback or input for what statistics would be useful to you, either as a package consumer or package author, please let us know. The best way is to file an issue &lt;a href='https://github.com/nuget/nugetgallery'&gt;on the repository&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Workflow Changes for CodePlex Issues</title>
   <link href="http://blog.nuget.org/20130211/workflow-changes-for-codeplex-issues.html"/>
   <updated>2013-02-11T00:00:00-08:00</updated>
   <id>http://blog.nuget.org/20130211/workflow-changes-for-codeplex-issues</id>
   <content type="html">&lt;p&gt;A couple weeks ago, some of you noticed that the core team closed a few issues on &lt;a href='http://nuget.codeplex.com'&gt;http://nuget.codeplex.com&lt;/a&gt; that were in the “Soonish” release. The items that were closed were feature suggestions that, while not bad ideas, were things that the core team decided weren’t going to make the cut for the next few releases. The pushback from the community in response was understandable. After all, if NuGet is an OSS project, why would the core team close good ideas simply because we weren’t going to act on them? Firstly, we’ve reopened the items that we had closed and moved them to the “Product Backlog” release (more on that momentarily). We also spent some time thinking about how we can do a better job balancing what feels like two competing interests in the same issue repository. The first is the interest of the core team to more efficiently manage its day to day work – and this means maintaining a high signal to noise ratio in the release buckets that we work from. The second interest is that of the community to actively participate in development of NuGet, whether that means filing new product ideas or pulling a new idea from the list which will ultimately find its way back into the product via a pull request. So here’s how we’re planning to organize issues and perform triage going forward in an attempt to better satisfy both sets of interests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Get rid of the “Soonish” release. We had originally created this as a way to identify things that were potential candidates for a near term release as opposed to items in “Product Backlog” – however, over the last several months, we’ve observed that items in this release have built up to a level where the core team isn’t going to be able to act on many of these either – resulting in effectively 2 different backlog buckets. In sum, it was a nice idea, but it hasn’t worked out in the way that we had hoped.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Rename “Product Backlog” to “Up For Grabs”. This release represents issues that we would accept as a pull request if someone from the community implemented it with sufficient quality. One of the reasons that we closed items in “Soonish” rather than moving them to backlog was that we believe &amp;#8220;backlog&amp;#8221; to imply that the core team will eventually get around to acting on the item, and we felt like this was misleading. Items in backlog are those that the core team has decided are good ideas but not ideas that we will likely revisit. We do periodically pull highly-voted items from the backlog into an active release, but this is not a part of our regular rhythm. As such, we want the name of the release to more accurately reflect how it’s being used.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Add an acknowledgements.txt file to the repository and insert this text into the release notes. In general, we want to figure out better ways to thank individuals who take their role in the NuGet community to the next step by submitting pull requests for the issues that they are passionate about. Adding this kind of recognition seems like an obvious step that we can take here to do better at encouraging and rewarding this kind of participation.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;We triage issues a couple times per week. When considering a new issue, the decision flow will look like the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this something that we need to work on for the current release? If so, assign to the current release. The bar for this question changes based on the type of release (e.g. some releases are more focused on risk management, some on new feature development).&lt;/li&gt;

&lt;li&gt;Is this something that the core team plans to work on? If so, assign to the next actual release. No more of the revolving “Next” release as this would allow us to be passive about making decisions on issues that we repeatedly never get to.&lt;/li&gt;

&lt;li&gt;Is this something that we think is a good idea, but know that the core team is not going to get around to working on in the foreseeable future? If so, assign to “Up For Grabs” release so that it can be voted on and &lt;span&gt;ideally&lt;/span&gt; picked up by the community.&lt;/li&gt;

&lt;li&gt;Is this something that we do not think is a good idea for NuGet? If so, close the issue with relevant explanation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;The planning process for a new release will look like the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure that roadmap features have been added to the upcoming release (e.g. ensure that all potential work for the release has been added in the form of a CodePlex issue).&lt;/li&gt;

&lt;li&gt;Triage all of the unfinished items in the release that was just completed. For each item, either move it to the next release, move to “Up For Grabs”, or close.&lt;/li&gt;

&lt;li&gt;If an issue has cascaded from release to release more than 2 times, move it to “Up For Grabs”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’re sorry if the recent closing of issues on CodePlex gave you the impression that we were somehow making a move towards being less open and hope that the above steps give you a little more insight into how we think about our working and planning rhythms. The core team would love to be able to implement all of the good ideas that fit within the vision for NuGet - however, we are finite and can only get through a subset of the total items. With your help in grabbing issues from Up For Grabs, we&amp;#8217;re looking forward to being able to get a lot more accomplished!&lt;/p&gt;

&lt;p&gt;The quality of issues filed on NuGet has historically been very high, and we appreciate that. In the same way, we want and appreciate your thoughts and comments on how we can continually improve our processes - hopefully that is evident in these changes. As such, we’ll hold off for a couple of days to collect your feedback on the new approach and then, assuming that there are no blocking issues raised, make the changes outlined above.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Managing Package Owners on nuget.org</title>
   <link href="http://blog.nuget.org/20130205/managing-package-owners.html"/>
   <updated>2013-02-05T00:00:00-08:00</updated>
   <id>http://blog.nuget.org/20130205/managing-package-owners</id>
   <content type="html">&lt;p&gt;While each NuGet package&amp;#8217;s &lt;a href='http://docs.nuget.org/docs/reference/nuspec-reference'&gt;nuspec metadata&lt;/a&gt; defines the package&amp;#8217;s owner(s), the NuGet gallery at nuget.org ignores that piece of nuspec metadata. Instead, ownership of a package is defined by who publishes the package to the gallery. Sometimes this metadata needs to be managed beyond the initial package publishing too, which means the owner metadata needs to be mutable while the package itself is not.&lt;/p&gt;

&lt;h2 id='setting_a_packages_initial_owner'&gt;Setting a Package&amp;#8217;s Initial Owner&lt;/h2&gt;

&lt;p&gt;When a brand new package is published to nuget.org, its initial owner is defined by the user that published the package.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the website&amp;#8217;s &amp;#8216;Upload Package&amp;#8217; page was used to publish the package, then the logged-on user is the package&amp;#8217;s owner.&lt;/li&gt;

&lt;li&gt;If &lt;code&gt;nuget.exe push&lt;/code&gt; was used to publish the package from the command-line, then the API key specified to nuget.exe will define the package&amp;#8217;s owner. This can be done by either including the API key in the &lt;a href='http://docs.nuget.org/docs/reference/command-line-reference#Push_Command'&gt;Push command&lt;/a&gt;, or by using the &lt;a href='http://docs.nuget.org/docs/reference/command-line-reference#Setapikey_Command'&gt;SetApiKey command&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='specifying_additional_package_owners'&gt;Specifying Additional Package Owners&lt;/h2&gt;

&lt;p&gt;It&amp;#8217;s common for a package to have multiple developers; each developer can be listed as a co-owner of the package. Packages can also utilize a convention for &amp;#8220;organizations&amp;#8221; to indicate company/group ownership of a package. For example, the Microsoft ASP.NET packages are co-owned by &lt;a href='http://nuget.org/profiles/microsoft'&gt;microsoft&lt;/a&gt;, &lt;a href='http://nuget.org/profiles/aspnet'&gt;aspnet&lt;/a&gt;, and sometimes individuals on the feature team. The &amp;#8216;microsoft&amp;#8217; and &amp;#8216;aspnet&amp;#8217; accounts are simply set up with a mailing list email address that reaches the teams that manage the accounts.&lt;/p&gt;

&lt;p&gt;Once a package has been published to nuget.org, it&amp;#8217;s easy to invite additional users to become owners of the package.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href='https://nuget.org/users/account/LogOn'&gt;Log on&lt;/a&gt; to nuget.org with the account that is the current owner of the package;&lt;/li&gt;

&lt;li&gt;Navigate to the package page using the &amp;#8216;Packages&amp;#8217; tab, searching, or clicking your username to and then &amp;#8217;&lt;a href='https://nuget.org/account/Packages'&gt;Manage My Packages&lt;/a&gt;&amp;#8217;;&lt;/li&gt;

&lt;li&gt;When logged on as the package&amp;#8217;s owner, there is a &amp;#8216;Manage Owners&amp;#8217; link on the left side to click;&lt;/li&gt;

&lt;li&gt;Enter the username of the person to add as an owner and click &amp;#8216;Add&amp;#8217;;&lt;/li&gt;

&lt;li&gt;An email is then sent to the new co-owner, as an invitation to become an owner of the package;&lt;/li&gt;

&lt;li&gt;Once that user clicks the link, they are a full co-owner with full control over the package, including the ability to remove other users as owners.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Until the new owner confirms ownership, they &lt;em&gt;will not&lt;/em&gt; be listed as an owner of the package. When viewing the &amp;#8216;Manage Owners&amp;#8217; page, you will see a &amp;#8220;pending approval&amp;#8221; entry in the current owners. That invitation can be removed, just as other owners can be removed.&lt;/p&gt;

&lt;p&gt;This process of invitations prevents users from falsely adding other users as owners of their packages. Note that the &amp;#8220;Authors&amp;#8221; metadata is purely freeform text; only &amp;#8220;Owners&amp;#8221; are controlled.&lt;/p&gt;

&lt;h2 id='removing_package_owners'&gt;Removing Package Owners&lt;/h2&gt;

&lt;p&gt;All package owners are peers. This means any package owner can publish a new version of the package. It also means that any package owner can remove any other package owner. No owner has more authority than other owners.&lt;/p&gt;

&lt;p&gt;When a package has multiple owners and one needs to be removed the process is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href='https://nuget.org/users/account/LogOn'&gt;Log on&lt;/a&gt; to nuget.org with the account that is the current owner of the package;&lt;/li&gt;

&lt;li&gt;Navigate to the package page using the Packages tab, searching, or clicking your username to and then &amp;#8217;&lt;a href='https://nuget.org/account/Packages'&gt;Manage My Packages&lt;/a&gt;&amp;#8217;;&lt;/li&gt;

&lt;li&gt;When logged on as the package&amp;#8217;s owner, there is a &amp;#8216;Manage Owners&amp;#8217; link on the left side to click;&lt;/li&gt;

&lt;li&gt;Click the &amp;#8216;remove&amp;#8217; link next to the owner to be removed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='transfering_package_ownership'&gt;Transfering Package Ownership&lt;/h2&gt;

&lt;p&gt;We sometimes get support requests to transfer package ownership from one user to another, but you can almost always accomplish this yourself. Transfering ownership from one user to another is simply a combination of the two features above.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The current owner invites the new user to become a co-owner and the new user accepts the invite;&lt;/li&gt;

&lt;li&gt;The new user removes the old user from the list of owners.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This request has come in under a couple forms but the process works the same.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The package ownership is changing from one developer to another&lt;/li&gt;

&lt;li&gt;The package was accidentally published using the wrong account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='orphaned_packages'&gt;Orphaned Packages&lt;/h2&gt;

&lt;p&gt;One last scenario has occurred, but not many times. Packages have become orphans and the only package owner account cannot be used to add new owners. Here are some examples of this scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The owner&amp;#8217;s account is associated with an email address that no longer exists and the user has forgotten their password&lt;/li&gt;

&lt;li&gt;The registered owner has left the company that produces the package and cannot be reached to update the package ownership&lt;/li&gt;

&lt;li&gt;Due to a bug that has only affected a handful of packages, the package is somehow ownerless on the gallery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some members of the NuGet team are in the &amp;#8216;admin&amp;#8217; role on the gallery and can access the &amp;#8216;Manage Owners&amp;#8217; link for any package. If you are the rightful owner of a package and cannot reach the current owner to gain ownership permissions, then use the &amp;#8216;Report Abuse&amp;#8217; link on the gallery to reach the NuGet team. We will then follow a process to verify your ownership of the package. If we determine you should be an owner of the package, we will use the &amp;#8216;Manage Owners&amp;#8217; link for the package ourselves and send you the invite to become an owner. We will only do this after verifying that you should be an owner and the process for this varies by circumstances. Often times, we will use the package&amp;#8217;s Project URL to find a way to contact the project owner, but we may also use Twitter, Email, or other means for contacting the project owner.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A quick tutorial on the Update-Package command</title>
   <link href="http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html"/>
   <updated>2012-12-31T00:00:00-08:00</updated>
   <id>http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command</id>
   <content type="html">&lt;p&gt;Among the supported commands in NuGet&amp;#8217;s Package Manager Console, &lt;strong&gt;Update-Package&lt;/strong&gt; is arguably the most powerful in terms of its supported parameters and switches. The primary purpose of the command is to update package(s) in your projects to a higher (possibly latest) version. However, the provided parameters allow you to twist this behavior in many different ways. In this post, I&amp;#8217;m going to give a quick tutorial on what possible ways you can invoke the command.&lt;/p&gt;

&lt;p&gt;In total, the &lt;strong&gt;Update-Package&lt;/strong&gt; command offers eight parameters (in addition to the built-in PowerShell parameters):&lt;/p&gt;
&lt;table cellspacing='0' border='1' cellpadding='6'&gt;
   &lt;tr&gt;
      &lt;th&gt;Parameter&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-Id&lt;/td&gt;
      &lt;td&gt;string&lt;/td&gt;
      &lt;td&gt;Specifies the Id of the package to be updated.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-ProjectName&lt;/td&gt;
      &lt;td&gt;string&lt;/td&gt;
      &lt;td&gt;Specifies the name of the project in which packages should be updated.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-Version&lt;/td&gt;
      &lt;td&gt;SemanticVersion*&lt;/td&gt;
      &lt;td&gt;Specifies the new target version of the package as a result of the update.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-Source&lt;/td&gt;
      &lt;td&gt;string&lt;/td&gt;
      &lt;td&gt;Specifies where to look for package updates, overriding the package sources that are specified in the Options dialog. This value can be either a url to a remote repository or a path to a local repository or the name of a package source specified in the Options dialog.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-IgnoreDependencies&lt;/td&gt;
      &lt;td&gt;Switch parameter&lt;/td&gt;
      &lt;td&gt;If set, NuGet will ignore dependency packages and only update the main package.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-Safe&lt;/td&gt;
      &lt;td&gt;Switch parameter&lt;/td&gt;
      &lt;td&gt;If set, NuGet will only update to a new version that has the same major and minor versions as the previous package. For example, if the old version is 1.2.0, NuGet will accept the update package with version of 1.2.1 or 1.2.9999  but it will &lt;em&gt;not&lt;/em&gt; accept 1.3.0.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-IncludePrerelease&lt;/td&gt;
      &lt;td&gt;Switch parameter&lt;/td&gt;
      &lt;td&gt;If set, NuGet will consider prerelease packages as candidates for updates.&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr&gt;
      &lt;td&gt;-Reinstall&lt;/td&gt;
      &lt;td&gt;Switch parameter&lt;/td&gt;
      &lt;td&gt;If set, instead of updating the package to the latest version, NuGet will uninstall the package and reinstall the same version. This is useful when, for example, you've updated the target framework of your project, e.g. from .NET 4.0 to .NET 4.5, and you want to reference .NET 4.5-specific assemblies in the package. You can't set this parameter together with the -Version parameter.&lt;/td&gt;
   &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;*&lt;/code&gt;Although the type of the -Version parameter is &lt;strong&gt;SemanticVersion&lt;/strong&gt;, which is a type declared by NuGet, you can just use string when you set it. PowerShell will automatically convert it for you, as long as the value can be parsed by the &lt;strong&gt;SemanticVersion&lt;/strong&gt; class.&lt;/p&gt;

&lt;p&gt;With that, here are the common use cases for the Update-Package command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Update a particular package in a project to the latest version:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; jQuery &lt;strong&gt;-ProjectName&lt;/strong&gt; MyProject&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Update a particular package in a project to the latest version, using safe update rule:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; jQuery &lt;strong&gt;-ProjectName&lt;/strong&gt; MyProject &lt;strong&gt;-Safe&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Update a particular package in a project to a particular version:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; jQuery &lt;strong&gt;-ProjectName&lt;/strong&gt; MyProject &lt;strong&gt;-Version&lt;/strong&gt; 1.8&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Update a particular package in &lt;em&gt;all&lt;/em&gt; projects of the current solution to the latest version:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; jQuery&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Update a particular package in &lt;em&gt;all&lt;/em&gt; projects of the current solution to a particular version:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; jQuery &lt;strong&gt;-version&lt;/strong&gt; 1.8&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Reinstall a particular package in &lt;em&gt;all&lt;/em&gt; projects of the current solution:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; jQuery &lt;strong&gt;-reinstall&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Update &lt;em&gt;all&lt;/em&gt; packages in a project to the latest versions:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; &lt;strong&gt;-ProjectName&lt;/strong&gt; MyProject&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Reinstall &lt;em&gt;all&lt;/em&gt; packages in a project:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; &lt;strong&gt;-ProjectName&lt;/strong&gt; MyProject &lt;strong&gt;-reinstall&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Update &lt;em&gt;all&lt;/em&gt; packages in &lt;em&gt;all&lt;/em&gt; projects of the current solution to the latest versions:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Reinstall &lt;em&gt;all&lt;/em&gt; packages in &lt;em&gt;all&lt;/em&gt; projects of the current solution:&lt;br /&gt; &lt;code&gt;&lt;strong&gt;Update-Package&lt;/strong&gt; &lt;strong&gt;-Reinstall&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phew, that&amp;#8217;s a lot of different combinations; but they are quite intuitive and easy to remember. To keep the list small, I left out the -IgnoreDependencies and -IncludePrelease parameters but you can add either (or both) of them to any of the example above (except that you can&amp;#8217;t use -Version and -Reinstall together, remember?) to adjust the behavior of the command.&lt;/p&gt;

&lt;p&gt;Hope that helps. Happy New Year.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Creating custom package rules for your build</title>
   <link href="http://blog.nuget.org/20121023/creating-custom-package-rules-for-your-build.html"/>
   <updated>2012-10-23T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20121023/creating-custom-package-rules-for-your-build</id>
   <content type="html">&lt;p&gt;When you build your NuGet packages using &lt;strong&gt;nuget.exe&lt;/strong&gt;, you may have noticed that sometimes you get a warning about the created package. Here&amp;#8217;s one example:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/nuget-exe-warning.PNG' alt='A package warning' /&gt;&lt;/p&gt;

&lt;p&gt;This warning is generated by one of NuGet&amp;#8217;s &lt;em&gt;package analysis rules&lt;/em&gt;. Think of these as the NuGet equivalent of an FxCop rule. When &lt;strong&gt;nuget.exe&lt;/strong&gt; creates a package, it automatically executes the package analysis step which in turn invokes all the registered rules. These rules will, one by one, examine the built package and emit the warnings as you see. You can disable this analysis step by supplying the &lt;strong&gt;&lt;code&gt;-NoPackageAnalysis&lt;/code&gt;&lt;/strong&gt; parameter to the &amp;#8216;pack&amp;#8217; command, although we don&amp;#8217;t recommend it.&lt;/p&gt;

&lt;p&gt;By default, &lt;strong&gt;nuget.exe&lt;/strong&gt; includes a set of built-in rules. These are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;InitScriptNotUnderToolsRule&lt;/strong&gt;: detect whether there is an &lt;em&gt;init.ps1&lt;/em&gt; file that is not placed directly under the &lt;em&gt;tools&lt;/em&gt; directory.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;InvalidFrameworkFolderRule&lt;/strong&gt;: detect whether there is an unrecognized framework folder name.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;MisplacedAssemblyRule&lt;/strong&gt;: detect whether any assembly files are placed outside of the &lt;em&gt;lib&lt;/em&gt; folder.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;MisplacedScriptFileRule&lt;/strong&gt;: detect whether any Powershell .ps1 files are placed outside of the &lt;em&gt;tools&lt;/em&gt; folder.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;MisplacedTransformFileRule&lt;/strong&gt;: detect whether a transform file (&lt;em&gt;.pp&lt;/em&gt; or &lt;em&gt;.transform&lt;/em&gt;) is placed outside of the &lt;em&gt;content&lt;/em&gt; folder.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;MissingSummaryRule&lt;/strong&gt;: detect whether the Summary attribute is missing when the Description attribute is longer than 300 characters.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;WinRTNameIsObsoleteRule&lt;/strong&gt;: detect the presence of a &amp;#8216;WinRT&amp;#8217; framework folder. (Starting with NuGet 2.1, the &amp;#8216;WinRT&amp;#8217; moniker is obsolete and we recommend people use &amp;#8216;NetCore45&amp;#8217; or &amp;#8216;Windows8&amp;#8217; instead.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is not very well-known is that the rule set is extensible, meaning that you can write your own custom rules to cater to your needs. For example, the Microsoft ASP.NET team has written a rule to ensure that all packages that we ship have an Id that start with &lt;strong&gt;Microsoft.AspNet.&lt;/strong&gt;&lt;em&gt;. In this post, I will show you how easy it is to write a custom package analysis rule.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id='develop_rule_assembly'&gt;Develop rule assembly&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, create a class library project that targets .NET 4.0. You can add multiple rules in one assembly.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Add an assembly reference to &lt;strong&gt;nuget.exe&lt;/strong&gt;. You need it for the package rule types. In the Properties window, set both &lt;em&gt;Copy Local&lt;/em&gt; and &lt;em&gt;Specific Version&lt;/em&gt; to &lt;strong&gt;False&lt;/strong&gt;, because we don&amp;#8217;t want to deploy &lt;strong&gt;nuget.exe&lt;/strong&gt; together with our extension assembly.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Add another assembly reference to &lt;strong&gt;System.ComponentModel.Composition&lt;/strong&gt;. You need this because the analysis mechanism is based on &lt;strong&gt;&lt;a href='http://mef.codeplex.com/' title='MEF'&gt;MEF&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Now add a class to your project for each rule you want to create. A rule class must derive from the &lt;code&gt;NuGet.IPackageRule&lt;/code&gt; interface, and must export it using the MEF &lt;strong&gt;&lt;span&gt;Export&lt;/span&gt;&lt;/strong&gt; attribute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;
&lt;code&gt;
[Export(typeof(IPackageRule))]
public class PackageIdRule : IPackageRule
{

}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Here&amp;#8217;s the definition of the &lt;code&gt;IPackageRule&lt;/code&gt; interface:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
public interface IPackageRule
{
    IEnumerable&amp;lt;PackageIssue&gt; Validate(IPackage package);
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;As you can see, it has only one simple &lt;code&gt;Validate&lt;/code&gt; method, which receives an instance of the package that has just been built. The method will examine the package and return all the issues that it finds. An issue is represented by an instance of the &lt;code&gt;PackageIssue&lt;/code&gt; class.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
public class PackageIssue
{
    public PackageIssue(string title, string description, string solution);
    public PackageIssue(string title, string description, string solution, PackageIssueLevel level);

    public string Description { get; }
    public PackageIssueLevel Level { get; }
    public string Solution { get; }
    public string Title { get; }
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Each issue has a Title, a Description, a Level, which can be either Warning or Error, and a proposed Solution. Note: currently, &lt;strong&gt;nuget.exe&lt;/strong&gt; ignores the Level property and reports all issues as Warning.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the &lt;code&gt;Validate&lt;/code&gt; method that we wrote for the previously mentioned rule to enforce all package Ids start with &lt;strong&gt;Microsoft.AspNet.&lt;/strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
public IEnumerable&amp;lt;PackageIssue&gt; Validate(IPackage package)
{
    if (!package.Id.StartsWith(&quot;Microsoft.AspNet.&quot;, StringComparison.Ordinal))
    {
        yield return new PackageIssue(
            title: &quot;Package Id is not valid&quot;,
            description: &quot;The Id of this package doesn't start with 'Microsoft.AspNet.*'&quot;,
            solution: &quot;Rename the Id attribute so that it starts with 'Microsoft.AspNet.*'&quot;);
    }
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;h3 id='deploy_rule_assembly'&gt;Deploy rule assembly&lt;/h3&gt;

&lt;p&gt;After you&amp;#8217;ve successfully compiled the project, you need to put the assembly into the right place. &lt;strong&gt;nuget.exe&lt;/strong&gt; looks for extension assemblies in three places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;%localappdata%\nuget\commands&lt;/strong&gt; directory.&lt;/li&gt;

&lt;li&gt;The current directory from which &lt;strong&gt;nuget.exe&lt;/strong&gt; runs. Important: In this case, your assembly&amp;#8217;s name must end with &lt;strong&gt;Extensions.dll&lt;/strong&gt;, or else &lt;strong&gt;nuget.exe&lt;/strong&gt; will ignore it.&lt;/li&gt;

&lt;li&gt;A list of directories as specified by the &lt;strong&gt;NUGET_EXTENSIONS_PATH&lt;/strong&gt; environment variable, separated by commas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='summary'&gt;Summary&lt;/h3&gt;

&lt;p&gt;When &lt;strong&gt;nuget.exe&lt;/strong&gt; builds a package, it runs a set of analysis rules to spot potential issues with the package. You can write your own custom rules to enforce additional requirements in your organization. A rule is simply a class that drives from the &lt;code&gt;IPackageRule&lt;/code&gt; interface and is exported via MEF.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Invoking NuGet Services from inside Visual Studio</title>
   <link href="http://blog.nuget.org/20120926/invoking-nuget-services-from-inside-visual-studio.html"/>
   <updated>2012-09-26T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120926/invoking-nuget-services-from-inside-visual-studio</id>
   <content type="html">&lt;p&gt;One of the best kept secrets of the NuGet extension is that besides the UI that everyone has become familiar with, it also exports some useful services, via &lt;a href='http://msdn.microsoft.com/en-us/library/dd460648.aspx' title='MEF'&gt;MEF&lt;/a&gt;, which allow other components in VS to interact with NuGet. These include installing packages, uninstalling packages and querying for installed packages.&lt;/p&gt;

&lt;p&gt;Over the past year, the NuGet team has received many inquiries from various teams inside and outside Microsoft asking us how to perform such tasks from their components. We have solidified the guidance over time and wanted to share it broadly.&lt;/p&gt;

&lt;p&gt;As of the current version (2.0), NuGet exports six interfaces/services via MEF, all of which reside in the &lt;strong&gt;NuGet.VisualStudio&lt;/strong&gt; namespace in the &lt;strong&gt;NuGet.VisualStudio.dll&lt;/strong&gt; assembly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IVsPackageInstaller&lt;/strong&gt; - Contains methods to install NuGet packages into projects.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IVsPackageInstallerEvents&lt;/strong&gt; - Offers events which raise when packages are installed and uninstalled in the current solution.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IVsPackageInstallerServices&lt;/strong&gt; - Contains a method to retrieve installed packages in the current solution, as well as methods to check if a specified package Id is installed in a project.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IVsPackageUninstaller&lt;/strong&gt; - Contains methods to uninstall NuGet packages from projects.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IConsoleInitializer&lt;/strong&gt; - Trigger eager initialization of the NuGet Package Manager Console.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IVsTemplateWizard&lt;/strong&gt; - This interface is designed for project/item templates to include pre-installed packages, and is &lt;em&gt;not&lt;/em&gt; meant to be invoked from code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here I will not discuss the detailed APIs in each of the interfaces. You can easily explore those for yourself in the Object Browser window.&lt;/p&gt;

&lt;p&gt;Instead I will show you a step-by-step guide on how to reference the interfaces and use them in your code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;h4 id='first_install_the_nugetvisualstudio_nuget_package_into_your_project'&gt;First, install the &lt;strong&gt;NuGet.VisualStudio&lt;/strong&gt; nuget package into your project&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;&lt;a href='https://nuget.org/packages/NuGet.VisualStudio' title='NuGet.VisualStudio package'&gt;NuGet.VisualStudio&lt;/a&gt;&lt;/strong&gt; package contains the NuGet.VisualStudio.dll assembly which includes all the above interfaces.&lt;br /&gt;&lt;br /&gt; When installed, the package will automatically set the &lt;strong&gt;Embed Interop Types&lt;/strong&gt; property of the assembly reference to &lt;strong&gt;True&lt;/strong&gt;. The reason it does so is to make your code resilient against version changes when users update to newer versions of NuGet.&lt;br /&gt;&lt;br /&gt; For the same reason, you must NOT use any other types besides the above interfaces in your code. You must NOT reference any other NuGet assemblies either, including &lt;strong&gt;NuGet.Core.dll&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt; &lt;img src='/images/embedinteroptypes.png' alt='Embed Interop Types set to True' /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;h4 id='obtain_the_services'&gt;Obtain the services&lt;/h4&gt;

&lt;p&gt;With the package installed, you are ready to obtain those services from your code. Because they are exported as MEF contracts, you can import them either via MEF&amp;#8217;s Import attribute, or through the &lt;a href='http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.componentmodelhost.icomponentmodel.aspx' title='IComponentModel interface'&gt;IComponentModel service&lt;/a&gt; in code. Here&amp;#8217;s a sample code snippet:&lt;br /&gt;&lt;br /&gt; &lt;code&gt;var componentModel = (IComponentModel)GetService(typeof(SComponentModel));&lt;/code&gt;&lt;br /&gt; &lt;code&gt;IVsPackageInstallerServices installerServices = componentModel.GetService&amp;lt;IVsPackageInstallerServices&amp;gt;();&lt;/code&gt;&lt;br /&gt; &lt;code&gt;var installedPackages = installerServices.GetInstalledPackages();&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So there you have it. If you find yourself needing to do something that the above services do not provide, feel free to open a discussion on the &lt;a href='http://nuget.codeplex.com/discussions/topics/5362/general' title='NuGet Discussions Board'&gt;NuGet discussions board&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Recent Changes to Package Restore Consent</title>
   <link href="http://blog.nuget.org/20120907/recent-changes-to-package-restore-consent.html"/>
   <updated>2012-09-07T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120907/recent-changes-to-package-restore-consent</id>
   <content type="html">&lt;p&gt;When we released NuGet 2.0, one of the changes included the addition of a &lt;a href='http://blog.nuget.org/20120518/package-restore-and-consent.html'&gt;privacy-related constraint&lt;/a&gt; to the package restore feature. More specifically, NuGet 2.0 required that you provide explicit consent, via either a checkbox in the package manager configuration dialog or an environment variable, before it would successfully download required packages as a part of the package restore workflow.&lt;/p&gt;

&lt;p&gt;The constraint was added specifically with build scenarios in mind. However, the implementation extended to other scenarios and as a result, added some unhappiness to the overall NuGet experience. Therefore, we’ve revisited the implementation and limited its impact to only the scenario that it was designed to address and none other.&lt;/p&gt;

&lt;p&gt;The following changes have been made to the package restore workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added a ‘-RequireConsent’ command line flag to nuget.exe that, when present, causes NuGet to check for consent (this is the default behavior in NuGet 2.0)&lt;/li&gt;

&lt;li&gt;Modified the NuGet targets file which is created by enabling package restore such that it passes the flag to nuget.exe when restoring packages during build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The impact of this change is twofold.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The default package restore workflow will continue to check for consent as it does today&lt;/li&gt;

&lt;li&gt;Calling nuget.exe will no longer check for consent unless you explicitly pass the flag to the executable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hope here is that while we need to continue checking for consent in the build scenario (since downloading is not a known or obvious build step), this change will eliminate any additional frustrations related to requiring consent when simply using nuget.exe by itself.&lt;/p&gt;

&lt;p&gt;Additionally, because of the &lt;a href='http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages#Details'&gt;mechanics behind package restore&lt;/a&gt;, you won’t have to wait until the next NuGet release to take advantage of these changes. They are already available today as a part of the &lt;a href='http://nuget.codeplex.com/releases/view/58939'&gt;nuget.exe CodePlex download&lt;/a&gt; and the &lt;a href='http://nuget.org/packages/nuget.bootstrapper'&gt;NuGet.Bootstrapper package&lt;/a&gt;. The act of enabling package restore for a solution will cause the latest version of nuget.exe to be downloaded automatically, so no further action is needed in this scenario. If you have an existing solution where package restore is already enabled, you can update it by doing the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove the .nuget folder from the solution in Visual Studio&lt;/li&gt;

&lt;li&gt;Delete the .nuget folder from disk (keep Visual Studio open)&lt;/li&gt;

&lt;li&gt;Right-click on the solution in the Visual Studio solution explorer and re-enable NuGet package restore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The process of enabling package restore will then run again, which will in turn download the latest version of nuget.exe and nuget.targets. Also, if you happened to close Visual Studio before deleting the .nuget folder from disk, you may notice that your projects fail to load when re-opening the solution. In this case, simply right-click on the solution and re-enable NuGet package explorer, then right-click on each of the failed projects and reload them.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Feed Performance Update</title>
   <link href="http://blog.nuget.org/20120824/nuget-feed-performance-update.html"/>
   <updated>2012-08-24T09:30:00-07:00</updated>
   <id>http://blog.nuget.org/20120824/nuget-feed-performance-update</id>
   <content type="html">&lt;p&gt;As you might know, NuGet has been having some performance (and timeout) related issues recently. Earlier this week, we &lt;a href='http://blog.nuget.org/20120822/nuget-expected-downtime-completed.html'&gt;completed a deployment&lt;/a&gt; that helped, but it didn&amp;#8217;t address everything.&lt;/p&gt;

&lt;p&gt;Many users are still seeing slow responses or even timeouts when trying to use the &amp;#8216;Manage NuGet Packages&amp;#8217; dialog in Visual Studio.&lt;/p&gt;

&lt;h2 id='ongoing_investigation'&gt;Ongoing Investigation&lt;/h2&gt;

&lt;p&gt;The deployment earlier this week greatly improved the &lt;a href='http://nuget.org/packages'&gt;packages page&lt;/a&gt; on the gallery, but it didn&amp;#8217;t address the Visual Studio dialog performance as much as we had hoped. Since that deployment, we&amp;#8217;ve been focusing on the queries behind the Visual Studio dialog.&lt;/p&gt;

&lt;p&gt;We have found that the SQL queries that get executed from the &amp;#8216;Manage NuGet Package&amp;#8217; dialog are not great. While the execution plans look okay, the memory grants for the queries are HUGE&amp;#8211;MUCH bigger than they need to be. Because of the huge memory grants, the queries are stacking up behind each other waiting for memory to be granted. This is leading to poor performance and also timeouts.&lt;/p&gt;

&lt;p&gt;We are working to get a different approach for these queries in place. We will let you know when a fix is ready. If you&amp;#8217;re curious about what the queries look like, you can see the current and tentative rewritten queries &lt;a href='https://gist.github.com/3442185'&gt;here&lt;/a&gt;. The rewritten queries are using about 1/100th of the memory of the current queries.&lt;/p&gt;

&lt;p&gt;To stay in touch with us, follow &lt;a href='http://twitter.com/nuget'&gt;@nuget&lt;/a&gt;, or the &lt;a href='https://twitter.com/#!/search/%23nuget'&gt;#nuget tag&lt;/a&gt; on twitter for live updates. You can also check in on JabbR&amp;#8217;s &lt;a href='http://jabbr.net/#/rooms/nuget'&gt;#nuget room&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Upgrade Successful</title>
   <link href="http://blog.nuget.org/20120822/nuget-expected-downtime-completed.html"/>
   <updated>2012-08-22T23:30:00-07:00</updated>
   <id>http://blog.nuget.org/20120822/nuget-expected-downtime-completed</id>
   <content type="html">&lt;p&gt;Earlier this evening, &lt;a href='http://blog.nuget.org/20120822/nuget-expected-downtime.html'&gt;we announced&lt;/a&gt; that the &lt;a href='http://nuget.org'&gt;NuGet Gallery&lt;/a&gt; would be offline for about an hour during a scheduled upgrade. That upgrade is now complete.&lt;/p&gt;

&lt;p&gt;We expect this deployment to help address &lt;a href='http://blog.nuget.org/20120822/nuget-performance-issues.html'&gt;performance issues&lt;/a&gt; we&amp;#8217;ve been experiencing for the past week. We will continue to monitor the service and measure the results of this deployment.&lt;/p&gt;

&lt;h2 id='cdn_reenabled'&gt;CDN Re-Enabled&lt;/h2&gt;

&lt;p&gt;As a bonus, this deployment has re-enabled &lt;a href='http://msdn.microsoft.com/en-us/library/windowsazure/ee795176.aspx'&gt;Windows Azure CDN&lt;/a&gt; for NuGet packages. We had initially enabled the CDN last week but some users around the globe &lt;a href='http://nuget.codeplex.com/workitem/2503'&gt;reported&lt;/a&gt; the DNS name of the CDN host could not be resolved. After a week, we trust that the DNS name has propagated and we can now all benefit from faster package downloads.&lt;/p&gt;

&lt;p&gt;Thank you once again for your patience. If you encounter any issues with NuGet, feel free to report issues on &lt;a href='http://nuget.codeplex.com/WorkItem/Create'&gt;CodePlex&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To stay in touch with us, follow &lt;a href='http://twitter.com/nuget'&gt;@nuget&lt;/a&gt;, or the &lt;a href='https://twitter.com/#!/search/%23nuget'&gt;#nuget tag&lt;/a&gt; on twitter for live updates. You can also check in on JabbR&amp;#8217;s &lt;a href='http://jabbr.net/#/rooms/nuget'&gt;#nuget room&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Expected Downtime - August 22 11pm-12am PDT</title>
   <link href="http://blog.nuget.org/20120822/nuget-expected-downtime.html"/>
   <updated>2012-08-22T18:30:00-07:00</updated>
   <id>http://blog.nuget.org/20120822/nuget-expected-downtime</id>
   <content type="html">&lt;p&gt;As mentioned in the &lt;a href='http://blog.nuget.org/20120822/nuget-performance-issues.html'&gt;previous post&lt;/a&gt;, we&amp;#8217;ve been working to address some performance problems on the &lt;a href='http://nuget.org'&gt;NuGet Gallery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The fixes we have in place include some time-consuming database migrations. During our dry run deployments, we found that virtually all requests to the database will time out while these migrations are running. We have decided to take the precaution of shutting the gallery down during these migrations to ensure the best and fastest possible deployment. We are sorry for the inconvenience this will cause.&lt;/p&gt;

&lt;h2 id='timing'&gt;Timing&lt;/h2&gt;

&lt;p&gt;The &lt;a href='http://nuget.org'&gt;nuget.org&lt;/a&gt; website is expected to be down from 11pm-12am PDT tonight. During this time, all requests to browse, search, install, or update packages will fail. You will see errors in Visual Studio when you use the Online tab in the Manage NuGet Packages dialog.&lt;/p&gt;

&lt;h2 id='live_updates'&gt;Live Updates&lt;/h2&gt;

&lt;p&gt;Please follow &lt;a href='http://twitter.com/nuget'&gt;@nuget&lt;/a&gt;, or the &lt;a href='https://twitter.com/#!/search/%23nuget'&gt;#nuget tag&lt;/a&gt; on twitter for live updates. You can also check in on JabbR&amp;#8217;s &lt;a href='http://jabbr.net/#/rooms/nuget'&gt;#nuget room&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This blog will be updated once the deployment is completed.&lt;/p&gt;

&lt;h2 id='workarounds'&gt;Workarounds&lt;/h2&gt;

&lt;p&gt;Many users have found Scott Hanselman&amp;#8217;s tips on &lt;a href='http://www.hanselman.com/blog/HowToAccessNuGetWhenNuGetorgIsDownOrYoureOnAPlane.aspx'&gt;How to access NuGet when NuGet.org is down (or you&amp;#8217;re on a plane)&lt;/a&gt; to be helpful.&lt;/p&gt;

&lt;h2 id='deployment_process'&gt;Deployment Process&lt;/h2&gt;

&lt;p&gt;During this downtime, we will be doing the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating a pre-migration database backup&lt;/li&gt;

&lt;li&gt;Executing the database migrations against the database&lt;/li&gt;

&lt;li&gt;Performing a post-migration database backup&lt;/li&gt;

&lt;li&gt;Deploying changes to the gallery web application&lt;/li&gt;

&lt;li&gt;Verifying the successful deployment within a Staging instance of our Web Role&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once we have verified the successful staging deployment, we will swap the instances over to production. At that time service will resume.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re curious about what is getting deployed, feel free to check out the &lt;a href='https://github.com/NuGet/NuGetGallery/commits/master'&gt;commit history on the master branch&lt;/a&gt; in our GitHub repository at &lt;a href='https://github.com/NuGet/NuGetGallery'&gt;https://github.com/NuGet/NuGetGallery&lt;/a&gt;. The changes being deployed are from August 21st and 22nd.&lt;/p&gt;

&lt;h2 id='feature_request'&gt;Feature Request&lt;/h2&gt;

&lt;p&gt;Out of this situation comes a new feature request for the gallery: read-only mode. Ideally, deployments of this type could be handled by putting the gallery into a read-only mode and performing the deployment to a new web role with a copy of the database while the read-only gallery stays online. We will invest in setting up that model to be used in the future.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet Gallery Performance Issues</title>
   <link href="http://blog.nuget.org/20120822/nuget-performance-issues.html"/>
   <updated>2012-08-22T15:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120822/nuget-performance-issues</id>
   <content type="html">&lt;p&gt;Since August 16th, and especially since August 21st, the &lt;a href='http://nuget.org'&gt;NuGet Gallery&lt;/a&gt; has been exhbiting intermittent performance issues. Some users are reporting errors when attempting to browse or search for NuGet packages from Visual Studio or other clients. Many users are reporting that browsing and searching are slow. There have also been timeout errors when browsing &lt;a href='http://nuget.org/packages'&gt;the gallery&amp;#8217;s packages page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;During this time, we have been communicating with many of you on twitter, under the &lt;a href='https://twitter.com/#!/search/%23nuget'&gt;#nuget tag&lt;/a&gt;, as well as in JabbR&amp;#8217;s &lt;a href='http://jabbr.net/#/rooms/nuget'&gt;#nuget room&lt;/a&gt;. We truly appreciate your patience and understanding with us.&lt;/p&gt;

&lt;h2 id='status'&gt;Status&lt;/h2&gt;

&lt;p&gt;We have been working to address these performance issues over the last several days, and we hope to have a deployment in place this evening (August 22nd, Pacific Time). It looks like the deployment will cause a short outage though&amp;#8211;we will post more information about that when the details are available.&lt;/p&gt;

&lt;h2 id='root_cause'&gt;Root Cause&lt;/h2&gt;

&lt;p&gt;The root cause of the performance issues boils down to some sub-optimal queries that are used when searching the gallery&amp;#8211;especially when searching from Visual Studio. There are a couple reasons these queries are slow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Some missing indexes that could significantly aide the search queries.&lt;/li&gt;

&lt;li&gt;Table columns that have &lt;code&gt;nvarchar(max)&lt;/code&gt; as their data type when a size constraint can be applied. We are seeing that when these &lt;code&gt;nvarchar(max)&lt;/code&gt; columns are used in &lt;code&gt;ORDER BY&lt;/code&gt; clauses, it becomes a bottleneck.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The deployment we&amp;#8217;re preparing will address both of these issues by adding size constraints to many fields and then creating several new indexes. Unfortunately, the process of altering the Packages and PackageRegistrations tables and then creating these new indexes is going to take some time to apply &amp;#8211; during that time, the database will be rather unresponsive. Again, when we know more about the timing of the outage, we&amp;#8217;ll share the details.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Results of NuGet CDN Experiment</title>
   <link href="http://blog.nuget.org/20120810/results-of-nuget-cdn-experiment.html"/>
   <updated>2012-08-10T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120810/results-of-nuget-cdn-experiment</id>
   <content type="html">&lt;p&gt;A little over a week ago, &lt;a href='http://blog.nuget.org/20120802/help-us-test-nuget-cdn.html'&gt;we asked for your help with an experimentt&lt;/a&gt; that we were conducting to see whether there was value in enabling CDN support for our packages blob storage container. Over 100 of you responded from all over the world, and the data that you provided made it pretty clear that there was sufficient justification for turning on CDN support for the production NuGet blob storage container. So firstly, thank you to everyone who participated in the experiment!&lt;/p&gt;

&lt;p&gt;In addition to turning on CDN, we wanted to share the results of the data that you provided us. First, the worldwide numbers look like the following:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;No-CDN&lt;/td&gt;
&lt;td&gt;CDN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean&lt;/td&gt;
&lt;td&gt;33.8252&lt;/td&gt;
&lt;td&gt;22.88007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variance&lt;/td&gt;
&lt;td&gt;601.3293&lt;/td&gt;
&lt;td&gt;440.8645&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observations&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pearson Correlation&lt;/td&gt;
&lt;td&gt;0.704394&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hypothesized Mean Difference&lt;/td&gt;
&lt;td&gt;6.8&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;df&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;t Stat&lt;/td&gt;
&lt;td&gt;2.420113&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P(T&amp;lt;=t) one-tail&lt;/td&gt;
&lt;td&gt;0.0086&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;t Critical one-tail&lt;/td&gt;
&lt;td&gt;1.659219&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P(T&amp;lt;=t) two-tail&lt;/td&gt;
&lt;td&gt;0.0172&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;t Critical two-tail&lt;/td&gt;
&lt;td&gt;1.982383&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;As you can see, there are some additional tests that we included so that you statisticians out there can get a deeper sense of our methodology, but at a high level, you can see that the worldwide average time to download the top 25 NuGet packages &lt;em&gt;improved by over 10 seconds!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The improvements are even more pronounced depending on the specific region being considered. In the chart below, each vertical bar represents the range of values for the percentage of improvement and the horizontal line dividing each bar represents the average improvement. As you can see, the greatest improvements were seen in Australia with an average improvement of over 40%. Additionally, notable improvements can also be seen in each of the other regions from which we collected data.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/cdn-improvement.png' alt='CDN improvements by region' /&gt;&lt;/p&gt;

&lt;p&gt;You can anecdotally draw further conclusions to explain the latency numbers by looking at the landscape of Azure CDN nodes as it exists today.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://www.microsoft.com/global/windowsazure/PublishingImages/cdn/950.gif' alt='Azure CDN' /&gt;&lt;/p&gt;

&lt;p&gt;All in all, the experiment was a great success, and we will be activating CDN in production very soon. We couldn&amp;#8217;t have collected this level of data without your help, so again, many thanks!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Help Us Test CDN for NuGet.org</title>
   <link href="http://blog.nuget.org/20120802/help-us-test-nuget-cdn.html"/>
   <updated>2012-08-02T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120802/help-us-test-nuget-cdn</id>
   <content type="html">&lt;p&gt;Over the past few weeks, we’ve been investigating whether to turn on the &lt;a href='http://www.windowsazure.com/en-us/home/features/caching/'&gt;content delivery network (CDN)&lt;/a&gt; feature of the Azure blob storage container for NuGet packages. In theory, this would make package downloads faster – especially if you’re located outside of the United States.&lt;/p&gt;

&lt;p&gt;We want your help to conduct an experiment to measure the difference in downloading packages with CDN enabled verses disabled. Our initial experiment deployed nuget.exe into different regions and measured the time to download a set of NuGet packages. Unfortunately, in all of the regions we deployed to, we were still sitting on an Internet backbone connection, so even our baseline measurements (with CDN disabled) showed a statistically insignificant difference between a deployment in northern Europe and a deployment in the USA. As such, it would seem that enabling CDN wouldn’t yield any measurable benefit.&lt;/p&gt;

&lt;p&gt;We think that the reason for the inconclusive baseline is due to the fact that there’s no &lt;a href='http://en.wikipedia.org/wiki/Last_mile'&gt;“last mile”&lt;/a&gt; involved in the measurements, and this is where the majority of the slowdown happens. While we could try and simulate last mile time, we would rather change the experiment a bit and ask for your help.&lt;/p&gt;

&lt;p&gt;We’ve created a custom of NuGet.exe along with a batch file runner that you can download &lt;a href='/images/NuGet-CDN.zip'&gt;here&lt;/a&gt;. Just unpack the zip file and run NuGet-CDN.bat. This will download the top 25 NuGet packages from both the standard package URL and a CDN URL and then log the time it takes to perform the download operations. You will then be asked to optionally provide your location, which will help us get a better sense of the global impact of using the CDN.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/use-cdn-test.png' alt='Running the NuGet CDN batch file' /&gt;&lt;/p&gt;

&lt;p&gt;The batch process will wrap the log files along with your location information into a new NuGet package. Please email that package to &lt;a href='mailto:nugetgallery@outercurve.org'&gt;&amp;#110;&amp;#117;&amp;#103;&amp;#101;&amp;#116;&amp;#103;&amp;#097;&amp;#108;&amp;#108;&amp;#101;&amp;#114;&amp;#121;&amp;#064;&amp;#111;&amp;#117;&amp;#116;&amp;#101;&amp;#114;&amp;#099;&amp;#117;&amp;#114;&amp;#118;&amp;#101;&amp;#046;&amp;#111;&amp;#114;&amp;#103;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks in advance for your help!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet 2.0 Released</title>
   <link href="http://blog.nuget.org/20120619/nuget-2.0-released.html"/>
   <updated>2012-06-19T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120619/nuget-2.0-released</id>
   <content type="html">&lt;p&gt;We&amp;#8217;re happy to announce that we released NuGet 2.0 on 6/19/2012. This release includes support for grouping dependencies, tools and content by the target framework of the project. Additionally, we&amp;#8217;ve dramatically improved the performance of tab completion in the package management console.&lt;/p&gt;

&lt;h2 id='package_restore_consent_is_now_active'&gt;Package restore consent is now active&lt;/h2&gt;

&lt;p&gt;As described in an &lt;a href='http://blog.nuget.org/20120518/package-restore-and-consent.html'&gt;earlier post on package restore consent&lt;/a&gt;, NuGet 2.0 will now require that consent be given to enable package restore to go online to download packages. Please ensure that you have provided consent via either the package manager configuration dialog or the EnableNuGetPackageRestore environment variable.&lt;/p&gt;

&lt;p&gt;More details on NuGet 2.0 can be found on the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-2.0'&gt;release notes&lt;/a&gt;. Finally, NuGet 2.0 fixed several bugs. For a full list of work items fixed in NuGet 2.0, please view the &lt;a href='http://nuget.codeplex.com/workitem/list/advanced?keyword=&amp;amp;status=Closed&amp;amp;type=All&amp;amp;priority=All&amp;amp;release=NuGet%202.0&amp;amp;assignedTo=All&amp;amp;component=All&amp;amp;sortField=Votes&amp;amp;sortDirection=Descending&amp;amp;page=0'&gt;NuGet Issue Tracker&lt;/a&gt; for this release.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet 1.8 Hotfix Released</title>
   <link href="http://blog.nuget.org/20120529/nuget-1.8-hotfix-released.html"/>
   <updated>2012-05-29T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120529/nuget-1.8-hotfix-released</id>
   <content type="html">&lt;p&gt;With the &lt;a href='/20120525/nuget-1.8-released.html'&gt;NuGet 1.8 release&lt;/a&gt;, we found a breaking change that caused NuGet to fail on Windows XP machines. Earlier today, we released a hotfix to NuGet 1.8 that addresses this.&lt;/p&gt;

&lt;p&gt;We apologize for any inconvenience this issue may have caused. If you have further issues, please report them on &lt;a href='http://nuget.codeplex.com/workitem/list/basic'&gt;CodePlex&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more information, there is a &lt;a href='http://nuget.codeplex.com/discussions/356928'&gt;CodePlex discussion thread&lt;/a&gt; for this issue, which resulted in a &lt;a href='http://nuget.codeplex.com/workitem/2240'&gt;work item&lt;/a&gt; to fix the regression.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet 1.8 Released</title>
   <link href="http://blog.nuget.org/20120525/nuget-1.8-released.html"/>
   <updated>2012-05-25T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120525/nuget-1.8-released</id>
   <content type="html">&lt;p&gt;We&amp;#8217;re happy to announce that we released NuGet 1.8 on 5/23/2012. This release includes support for localized satellite assemblies, nuget.exe performance improvements, and 34 bug fixes. Details are in the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-1.8'&gt;NuGet 1.8 Release Notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='known_issue_on_windows_xp'&gt;Known issue on Windows XP&lt;/h2&gt;

&lt;p&gt;We would like to call out that shortly after NuGet 1.8 was released, we learned that a cryptography change in 1.8 broke users on Windows XP. Do not install NuGet 1.8 onto a Windows XP machine; if you have already installed NuGet 1.8, you can uninstall it and reinstall NuGet 1.7 using &lt;a href='http://nuget.codeplex.com/downloads/get/382255'&gt;this download link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We are working on a NuGet 1.8.1 release to address the regression. There is a &lt;a href='http://nuget.codeplex.com/discussions/356928'&gt;CodePlex discussion thread&lt;/a&gt; for this issue, which resulted in a &lt;a href='http://nuget.codeplex.com/workitem/2240'&gt;work item&lt;/a&gt; to fix the regression.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Package Restore and Consent</title>
   <link href="http://blog.nuget.org/20120518/package-restore-and-consent.html"/>
   <updated>2012-05-18T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120518/package-restore-and-consent</id>
   <content type="html">&lt;p&gt;A little while back, our team had the pleasure of talking about NuGet with some privacy experts. These are folks who are passionate about your privacy and laws that protect your privacy.&lt;/p&gt;

&lt;p&gt;As we were describing NuGet&amp;#8217;s package restore feature, the privacy experts became interested in the details surrounding the package restore workflow – particularly the part where NuGet goes online to the NuGet gallery to fetch missing packages. Here’s the scenario that raised their interest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developer A creates a project, installs NuGet packages, and enables package restore&lt;/li&gt;

&lt;li&gt;Developer A checks the project into version control. The NuGet packages aren&amp;#8217;t included because of the package restore setting&lt;/li&gt;

&lt;li&gt;Developer B checks the project out of source control and builds&lt;/li&gt;

&lt;li&gt;Because package restore is enabled, NuGet goes online to the gallery, downloads and installs the required packages, and continues with the build.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point is where the concern was raised. In this scenario, Developer B has never said to NuGet, &amp;#8220;Sure, you can go online on my behalf.&amp;#8221; This can be a big deal because the simple act of making a request over the Internet can reveal information about the user (for example, from the user’s IP address, we can approximate her location). In some regions and countries, revealing this kind of information &lt;a href='http://en.wikipedia.org/wiki/Data_Protection_Directive'&gt;is a big no-no&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, none of us are lawyers and certainly not the type that work in international privacy issues. We just want to build a great product that developers can feel confident using, regardless of where they are. Hence the package restore consent feature.&lt;/p&gt;

&lt;h2 id='what_did_we_do_exactly'&gt;What did we do exactly?&lt;/h2&gt;

&lt;p&gt;Our goal is that when someone builds a project that uses NuGet package restore, the person overseeing the build provides explicit consent to enable package restore to go online to download NuGet packages.&lt;/p&gt;

&lt;p&gt;You’ll note that I was specific about who needs to provide the consent. When we were initially brainstorming solutions, we had talked about simply writing the consent flag into the NuGet config file or into build targets. However, these options would enable Developer A to effectively consent on behalf of Developer B, because these files are pulled down from version control, and that would defeat the purpose of requiring explicit consent. Therefore, we’ve provided 2 ways to specify package restore consent. The first approach is to check the box in NuGet’s package manager configuration dialog box as follows:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/pr-consent-configdlg.png' alt='Package restore consent in the package manager configuration dialog' /&gt;&lt;/p&gt;

&lt;p&gt;Checking this box will write the following XML into your NuGet.Config file (in your user profile directory tree)&lt;/p&gt;
&lt;pre&gt;
&amp;lt;packageRestore&amp;gt;
  &amp;lt;add key=&quot;enabled&quot; value=&quot;true&quot; /&amp;gt;
&amp;lt;/packageRestore&amp;gt;
&lt;/pre&gt;
&lt;p&gt;For scenarios where developers are building on their own machines, this will be the way to provide consent for package restore. However, there are cases where it&amp;#8217;s not actually a person who&amp;#8217;s doing the building and who therefore can&amp;#8217;t provide consent this way. (And where Visual Studio isn&amp;#8217;t even installed.) The prototypical example is a build server. In that case, NuGet will also look for an environment variable called EnableNuGetPackageRestore. To enable package restore for scenarios where the Visual Studio option is not practical, set this variable to true.&lt;/p&gt;

&lt;h2 id='what_if_i_havent_given_consent'&gt;What if I haven’t given consent?&lt;/h2&gt;

&lt;p&gt;If you try to build a project that uses package restore and you haven’t given consent to NuGet to download packages, you will get a build error that looks like the following:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/pr-consent-builderror.png' alt='Build error when package restore consent is not given' /&gt;&lt;/p&gt;

&lt;p&gt;The build error describes the issue and provides instructions for providing consent. As the package restore consent feature rolls out, you will probably see this error, particularly on build servers, so we wanted to give you advance warning in this post.&lt;/p&gt;

&lt;h2 id='its_coming'&gt;It’s coming&lt;/h2&gt;

&lt;p&gt;In NuGet 1.8, we’ve added all of the logic for supporting the consent requirement. However, we won’t start actively enforcing the constraint (that is, causing build failures) until NuGet 2.0. This delay gives you time to provide consent for both your developer machines and your build infrastructure, and will help avoid sudden and unexpected build breaks when we release NuGet 2.0.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet's Sources Are Moving to Git</title>
   <link href="http://blog.nuget.org/20120419/nuget-sources-moving-to-git.html"/>
   <updated>2012-04-19T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120419/nuget-sources-moving-to-git</id>
   <content type="html">&lt;p&gt;At the end of April, we&amp;#8217;ll be moving the NuGet sources hosted on &lt;a href='http://codeplex.com'&gt;CodePlex&lt;/a&gt; from a Mercurial repository to a Git repository. This won&amp;#8217;t impact or affect NuGet users, but NuGet contributors and those that follow NuGet&amp;#8217;s development might need to act before this move.&lt;/p&gt;

&lt;h2 id='forks'&gt;Forks&lt;/h2&gt;

&lt;p&gt;All of the &lt;a href='http://nuget.codeplex.com/SourceControl/network'&gt;current NuGet forks on CodePlex&lt;/a&gt; will be deleted as part of this move. If you have forked NuGet, and you need to keep that fork, you can clone the fork and keep it locally or you can find somewhere else to push it. Aren&amp;#8217;t DVCS great?&lt;/p&gt;

&lt;h2 id='pull_requests'&gt;Pull Requests&lt;/h2&gt;

&lt;p&gt;The NuGet team will review all the &lt;a href='http://nuget.codeplex.com/sourcecontrol/list/contributions'&gt;currently active pull requests&lt;/a&gt; before we move to Git. We will not be accepting any new pull requests until this move is complete. Please wait to initiate new pull requests until that time.&lt;/p&gt;

&lt;h2 id='commit_history'&gt;Commit History&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://nuget.codeplex.com/SourceControl/list/changesets'&gt;NuGet&amp;#8217;s commit history&lt;/a&gt; will be preserved. If you&amp;#8217;ve contributed to NuGet, your contributions will still be included in the commit history.&lt;/p&gt;

&lt;h2 id='codeplex_project'&gt;CodePlex Project&lt;/h2&gt;

&lt;p&gt;All other areas of the &lt;a href='http://nuget.codeplex.com'&gt;NuGet CodePlex project&lt;/a&gt; (the URL, issues, discussions, etc.) will remain as they are.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have questions or concerns, please present them in the comments or &lt;a href='http://nuget.codeplex.com/discussions/create?ProjectName=nuget'&gt;start a discussion on CodePlex&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NuGet 1.7 Released</title>
   <link href="http://blog.nuget.org/20120404/nuget-1.7-released.html"/>
   <updated>2012-04-04T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120404/nuget-1.7-released</id>
   <content type="html">&lt;p&gt;We&amp;#8217;re happy to announce that we released NuGet 1.7 today. This release includes several new features as well as over 75 bug fixes. Details are in the &lt;a href='http://docs.nuget.org/docs/release-notes/nuget-1.7'&gt;NuGet 1.7 Release Notes&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The NuGet Gallery Outage on March 9th</title>
   <link href="http://blog.nuget.org/20120314/the-nuget-gallery-outage-on-march-9.html"/>
   <updated>2012-03-14T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120314/the-nuget-gallery-outage-on-march-9</id>
   <content type="html">&lt;p&gt;The &lt;a href='http://nuget.org'&gt;NuGet Gallery&lt;/a&gt; was unavailable on March 9th from approximately midnight until 7:52 A.M., nearly eight hours. During this time all HTTP requests to the gallery website failed. In addition to affecting website users, the outage affected all NuGet client programs (such as the Visual Studio extension and nuget.exe) and other software that relies on the NuGet Gallery&amp;#8217;s feed and API.&lt;/p&gt;

&lt;p&gt;To start, we apologize for the disruption and inconvenience that this incident caused. We know that many of our customers were affected by the outage and we want to be transparent about what happened, what issues we found, how we plan to address these issues, and how we are learning from the incident to prevent a similar occurrence in the future.&lt;/p&gt;

&lt;p&gt;The outage was caused by a NuGet Gallery application error, compounded by some shortcomings in our monitoring system and incident-response process for the NuGet gallery.&lt;/p&gt;

&lt;h2 id='what_happened_exactly'&gt;What Happened Exactly&lt;/h2&gt;

&lt;p&gt;Windows Azure rebooted the NuGet Gallery servers at midnight after performing a scheduled OS upgrade. After this reboot, the gallery&amp;#8217;s web roles failed to initialize due to a previously unknown bug in a script we wrote that we execute in order to enable HTTP compression for the gallery&amp;#8217;s feed. Because the web roles could not initialize, the website became unresponsive. Our monitoring service didn’t send any alerts about this situation. However, the team became aware of the problem around 7:30 A.M. and we were able to restore service by deleting the Azure deployment and creating a new one (bypassing the scripts&amp;#8217;s bug, although we didn&amp;#8217;t know about the bug yet).&lt;/p&gt;

&lt;h2 id='how_we_failed'&gt;How We Failed&lt;/h2&gt;

&lt;p&gt;As with most system failures of this severity, there was more than just one failure.&lt;/p&gt;

&lt;h3 id='deployment_testing'&gt;Deployment Testing&lt;/h3&gt;

&lt;p&gt;We continually and automatically test the process of deploying new versions of the gallery to Windows Azure by using a preview site. However, we missed testing reboot scenarios, and this masked a bug in our compression script.&lt;/p&gt;

&lt;h3 id='monitoring_service'&gt;Monitoring Service&lt;/h3&gt;

&lt;p&gt;As a result of this outage, we learned that our monitoring service had configuration issues that we did not know about. We understand that it&amp;#8217;s crucially important to continually test all of the systems that keep our website running, including things like monitoring, backup, and restore. We test our backup and restore continually using our preview site, but as we&amp;#8217;ve learned, we were not testing monitoring sufficiently.&lt;/p&gt;

&lt;h3 id='inadequate_incidentresponse_process'&gt;Inadequate Incident-Response Process&lt;/h3&gt;

&lt;p&gt;When the outage occurred, we didn&amp;#8217;t have a robust enough incident-response process, with the result that the response time for this outage that was simply not fast enough. There has been no dedicated operations team for the NuGet Gallery, and the development team has been assuming all responsibility for operational activities.&lt;/p&gt;

&lt;h3 id='bad_assumptions'&gt;Bad Assumptions&lt;/h3&gt;

&lt;p&gt;One of the reasons we had not formalized our incident response process or had people on call was that the NuGet gallery has been very reliable. (As we&amp;#8217;ve now been reminded, this is no excuse for lack of proper planning.)&lt;/p&gt;

&lt;p&gt;We have since also learned that two assumptions about how Windows Azure deployments work contributed to this issue. First, we assumed that we would be notified that an OS upgrade requiring a reboot had been scheduled. We&amp;#8217;ve learned that Windows Azure does not currently send notifications for scheduled OS upgrades, whether a reboot is required or not. We&amp;#8217;ve recommended to the Azure team that they start sending notifications in these cases.&lt;/p&gt;

&lt;p&gt;Second, we assumed that OS upgrades (or other maintenance) would be performed on one instance at a time within a deployment, and that if an upgrade failed, Azure would not then try to upgrade the remaining instances, effectively causing the entire deployment to fail. This one-at-a-time approach is how Azure handles customer-initiated upgrades. We&amp;#8217;ve recommended to the Azure team that they consider changing the Azure-initiated upgrade process accordingly, although we understand there are a lot challenges in doing this.&lt;/p&gt;

&lt;h2 id='what_were_changing'&gt;What We&amp;#8217;re Changing&lt;/h2&gt;

&lt;p&gt;All applications can fail, which is why it&amp;#8217;s crucial to have a proven, tested system in place to monitor the health of an application, and a proven, tested process in place to respond to incidents. To that end, we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regularly test our monitoring service (for example, by periodically making the preview site unavailable).&lt;/li&gt;

&lt;li&gt;Create a better incident-response process.&lt;/li&gt;

&lt;li&gt;Expand the team of people who understand Azure deployment and know how to troubleshoot failures.&lt;/li&gt;

&lt;li&gt;Always have at least one person on call to respond to incidents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will also regularly test server reboots after a deployment, using our preview site.&lt;/p&gt;

&lt;p&gt;While we can&amp;#8217;t guarantee that future incidents won&amp;#8217;t happen (in fact, we know they will), we &lt;em&gt;can&lt;/em&gt; guarantee that our response to any future incidents will be much more timely.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Introducing the NuGet Team Blog</title>
   <link href="http://blog.nuget.org/20120313/introducing-the-nuget-team-blog.html"/>
   <updated>2012-03-13T00:00:00-07:00</updated>
   <id>http://blog.nuget.org/20120313/introducing-the-nuget-team-blog</id>
   <content type="html">&lt;p&gt;For the last few months, the NuGet team has been considering starting a proper, official blog. &lt;strong&gt;This is that blog&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How do we plan to use this blog? Here are a few ways we know we&amp;#8217;ll use it (and I&amp;#8217;m sure we&amp;#8217;ll think of others as we go along):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Announcing new releases&lt;/li&gt;

&lt;li&gt;Announcing upcoming breaking or very impactful changes&lt;/li&gt;

&lt;li&gt;Pointing out particuarly important discussions on our CodePlex or GitHub sites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to leave us a comment, letting us know what else you&amp;#8217;d like to see here.&lt;/p&gt;</content>
 </entry>
 
</feed>