NuGet Package To Automatically Create Your NuGet Packages

I've also created a NuGet package called "Create New NuGet Package From Project After Each Build" that you can include in your Visual Studio project that will call the New-NuGetPackage.ps1 script from your project's Post-Build events to automatically create a NuGet package every time your project builds. So just add that NuGet package to your project and instantly you will have a NuGet package (.nupkg) created for your project that is always up-to-date with your last successful build. The .nupkg file is placed in the project's output directory (i.e. in the same directory as the project's .dll/.exe).

Depending on the size of your project and it's dependencies, the time this adds to your build should not be noticeable (only a second or two during my tests). Obviously the NuGet package does not automatically push the package to the gallery on every build though, as that would be very wasteful and would require more time each build.

Add The NuGet Package To Your Visual Studio Project

To add the "Create New NuGet Package From Project After Each Build" package to your project:

1. From Solution Explorer in Visual Studio, right-click on your project's References node and choose Manage NuGet Packages...
NavigateToManageNugetPackages.png

2. In the NuGet Package Manager, select Online from the menu on the left to search for packages online, and then in the search box on the top-right type in "New NuGet Package" (include the double quotes). When the "Create New NuGet Package From Project After Each Build" package appears, click its Install button.
InstallNuGetPackageFromPackageManager.png

3. That's it. You should now see a PostBuildScripts folder added to your project that contains the New-NuGetPackage.ps1 script and NuGet.exe.
FilesAddedToProject.png

The NuGet.exe is included so that you are not required to have NuGet.exe added to your PATH in order for the script to run. If you look in the project's properties you will also notice that a few lines were added to the Post-Build event section to call the New-NuGetPackage.ps1 script.

Now if you build your project the NuGet Package file should get created in your project's output directory.
NuGetPackageInOutputDirectory.png

Push Your Package To The NuGet Gallery

Since pushing your package to the NuGet Gallery is not automated, you still have to do that manually. Luckily you can simply use the New-NuGetPackage.ps1 script in the PostBuildScripts folder to pack and push the new NuGet Package to the Gallery. Just right-click on the New-NuGetPackage.ps1 file in Visual Studio and choose "Run with PowerShell". It will then prompt you for the file to pack, so just navigate up one directory and choose the project file (e.g. .csproj, .vbproj, .fsproj). When it prompts you if you want to push your package to the NuGet Gallery, choose "Yes"; this assumes you have setup your NuGet API key on your PC at some point.

Cannot resolve image macro, invalid image name or id.

Troubleshooting Errors

If you want to see output from the New-NuGetPackage.ps1 script and NuGet.exe, take a look at Visual Studio's Build Output window. This can be very helpful for identifying and troubleshooting any problems that you may have.

BuildOutputWindow.png

Last edited Jun 22, 2013 at 5:05 PM by deadlydog, version 23

Comments

mediafreakch Nov 6 at 4:08 PM 
Does this script support the Nuspec <files> directive?

ghstahl Oct 29 at 11:42 PM 
As everyone else, this thing is great and fantastically convenient.

Before I go digging into the script, I will ask here.
How do I get this thing to NOT include the resultant assembly in the nuget packages lib\netXX\ location.

Reason: The assembly is a MEF extension, so I don't want it delivered as a reference-able assembly.

I have my own nuspec override file that puts the assembly in the content/extensions folder.

<?xml version="1.0"?>

<package >
<metadata>
<id>COA.MEF.Calculator</id>
<version>1.0.0.3</version>
<title>COA.MEF.Calculator</title>
<authors>Pingo LLC</authors>
<owners>Pingo LLC</owners>
<licenseUrl>https://localhost/License.txt</licenseUrl>
<projectUrl>https://localhost/COA.MEF.Calculator</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<summary>Pingo Helpers for MVC</summary>
<description>Pingo Helpers for MVC.</description>
<releaseNotes></releaseNotes>
<copyright>Copyright © Pingo LLC 2014</copyright>
<tags>Pingo PingoFeature</tags>

</metadata>
<files>
<file src="bin/Debug/>COA.MEF.Calculator.dll" target="content/extensions" />
</files>
</package>

tedmkuo Jul 31 at 7:06 PM 
Great work. It simplifies the packaging a lot! One issue I have is when I install the created package to my project, it also adds the _CreatNewNugetPackage folder to my project in addition to the dll in the References. Of course, I can manually remove the folder from my project. How can I install the package without creating the _CreateNewNugetPackage folder?

jhauser May 19 at 10:31 AM 
Hello,

Thanks for this package!
Since we have different languages on dev pcs and build server and we need a transparent solution i replaced a part of the skript:

```
# Get the path the NuGet Package was created to, and write it to the output stream.
$start = $packOutput.LastIndexOf(':\') - 1
$end = $packOutput.IndexOf('.nupkg') + '.nupkg'.Length
$path = $packOutput.Substring($start,$end-$start)
if (Test-Path $path)
{
$nuGetPackageFilePath = $path
Write-Output $nuGetPackageFilePath
}
else
{
throw "nuget package not found"
}
```

A bit hacky, but it seems to work for german and english version.

Heslacher Nov 19, 2013 at 8:41 AM 
Thanks a lot. Just a side note for users of german VS:
Inside the New-NuGetPackage.ps1 file you need to change the line 1017 from
$rxNugetPackagePath = [regex] "(?i)(Successfully created package '(?<FilePath>.*?)'.)"
to
$rxNugetPackagePath = [regex] "(?i)(Das Paket \`"(?<FilePath>.*?)\`".)"
otherwise it will throw this exception: Could not determine where NuGet Package was created to.

Togakangaroo Oct 13, 2013 at 8:07 PM 
Very very nice, way easier for simple stuff than my standard psake scripts. Maybe this will finally get my coworkers publishing their stuff.

NuGetter Aug 20, 2013 at 5:59 PM 
Great work. You made my day!