Real World Nuget
Posted
by JoshReuben
on Geeks with Blogs
See other posts from Geeks with Blogs
or by JoshReuben
Published on Sun, 23 Sep 2012 09:39:38 GMT
Indexed on
2012/09/23
15:38 UTC
Read the original article
Hit count: 356
Why Nuget
A higher level of granularity for managing references
When you have solutions of many projects that depend on solutions of many projects etc à escape from Solution Hell.
Links
· Using A GUI (Package Explorer) to build packages - http://docs.nuget.org/docs/creating-packages/using-a-gui-to-build-packages
· Creating a Nuspec File - http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvcnuget_topic2.aspx
· consuming a Nuget Package - http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvcnuget_topic3
· Nuspec reference - http://docs.nuget.org/docs/reference/nuspec-reference
· updating packages - http://nuget.codeplex.com/wikipage?title=Updating%20All%20Packages
· versioning - http://docs.nuget.org/docs/reference/versioning
POC Folder Structure
POC Setup Steps
· Install package explorer
· Source
o Create a source solution – configure output directory for projects (Project > Properties > Build > Output Path)
· Package
o Add assemblies to package from output directory (D&D)- add net folder
o File > Export – save .nuspec files and lib contents
<?xml version="1.0" encoding="utf-16"?>
<package >
<metadata>
<id>MyPackage</id>
<version>1.0.0.3</version>
<title />
<authors>josh-r</authors>
<owners />
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>My package description.</description>
<summary />
</metadata>
</package>
o File > Save – saves .nupkg file
· Create Target Solution
o In Tools > Options: Configure package source & Add package
Select projects:
Output from package manager (powershell console)
------- Installing...MyPackage 1.0.0 -------
Added file 'NugetSource.AssemblyA.dll' to folder 'MyPackage.1.0.0\lib'.
Added file 'NugetSource.AssemblyA.pdb' to folder 'MyPackage.1.0.0\lib'.
Added file 'NugetSource.AssemblyB.dll' to folder 'MyPackage.1.0.0\lib'.
Added file 'NugetSource.AssemblyB.pdb' to folder 'MyPackage.1.0.0\lib'.
Added file 'MyPackage.1.0.0.nupkg' to folder 'MyPackage.1.0.0'.
Successfully installed 'MyPackage 1.0.0'.
Added reference 'NugetSource.AssemblyA' to project 'AssemblyX'
Added reference 'NugetSource.AssemblyB' to project 'AssemblyX'
Added file 'packages.config'.
Added file 'packages.config' to project 'AssemblyX'
Added file 'repositories.config'.
Successfully added 'MyPackage 1.0.0' to AssemblyX.
==============================
o Packages folder created at solution level
o Packages.config file generated in each project:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MyPackage" version="1.0.0" targetFramework="net40" />
</packages>
A local Packages folder is created for package versions installed:
Each folder contains the downloaded .nupkg file and its unpacked contents – eg of dlls that the project references
Note: this folder is not checked in
UpdatePackages
o Configure Package Manager to automatically check for updates
o Browse packages - It automatically picked up the updates
Update Procedure
· Modify source
· Change source version in assembly info
· Build source
· Open last package in package explorer
· Increment package version number and re-add assemblies
· Save package with new version number and export its definition
· In target solution – Tools > Manage Nuget Packages – click on All to trigger refresh , then click on recent packages to see updates
· If problematic, delete packages folder
Versioning
uninstall-package mypackage
install-package mypackage –version 1.0.0.3
uninstall-package mypackage
install-package mypackage –version 1.0.0.4
Dependencies
<?xml version="1.0" encoding="utf-16"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>MyDependentPackage</id>
<version>1.0.0</version>
<title />
<authors>josh-r</authors>
<owners />
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>My package description.</description>
<dependencies>
<group targetFramework=".NETFramework4.0">
<dependency id="MyPackage" version="1.0.0.4" />
</group>
</dependencies>
</metadata>
</package>
Using NuGet without committing packages to source control
http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
Right click on the Solution node in Solution Explorer and select Enable NuGet Package Restore.
— Recall that packages folder is not part of solution
If you get downloading package ‘Nuget.build’ failed, config proxy to support certificate for https://nuget.org/api/v2/ & allow unrestricted access to packages.nuget.org
To test connectivity: get-package –listavailable
To test Nuget Package Restore – delete packages folder and open vs as admin.
In nugget msbuild:
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
TFSBuild Integration
Modify Nuget.Targets file
<RestorePackages Condition=" '$(RestorePackages)' == '' ">
True
</RestorePackages>
…
<PackageSource Include="\\IL-CV-004-W7D\Packages" />
Add System Environment variable EnableNuGetPackageRestore=true & restart the “visual studio team foundation build service host” service.
Important: Ensure Network Service has access to Packages folder
Nugetter TFS Build integration
Add Nugetter build process templates to TFS source control
For Build Controller - Specify location of custom assemblies
Generate .nuspec file from Package Explorer: File > Export
Edit the file elements – remove path info from src and target attributes
<?xml version="1.0" encoding="utf-16"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>Common</id>
<version>1.0.0</version>
<title />
<authors>josh-r</authors>
<owners />
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>My package description.</description>
<dependencies>
<group targetFramework=".NETFramework3.5" />
</dependencies>
</metadata>
<files>
<file src="CommonTypes.dll" target="CommonTypes.dll" />
<file src="CommonTypes.pdb" target="CommonTypes.pdb" />
…
Add .nuspec file to solution so that it is available for build:
Dev\NovaNuget\Common\NuSpec\common.1.0.0.nuspec
Add a Build Process Definition based on the Nugetter build process template:
Configure the build process – specify:
· .sln to build
· Base path (output directory)
· Nuget.exe file path
· .nuspec file path
Copy DLLs to a binary folder
1) Set copy local for an assembly reference to false
2) MSBuild Copy Task – modify .csproj file: http://msdn.microsoft.com/en-us/library/3e54c37h.aspx
<ItemGroup>
<MySourceFiles Include="$(MSBuildProjectDirectory)\..\SourceAssemblies\**\*.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(MySourceFiles)" DestinationFolder="bin\debug\SourceAssemblies" />
</Target>
3) Set Probing assembly search path from app.config - http://msdn.microsoft.com/en-us/library/823z9h8w(v=vs.80).aspx -
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="SourceAssemblies"/>
</assemblyBinding>
</runtime>
</configuration>
Forcing 'copy local = false'
The following generic powershell script was added to the packages install.ps1:
param($installPath, $toolsPath, $package, $project)
if( $project.Object.Project.Name -ne "CopyPackages")
{
$asms = $package.AssemblyReferences | %{$_.Name}
foreach ($reference in $project.Object.References)
{
if ($asms -contains $reference.Name + ".dll")
{
$reference.CopyLocal = $false;
}
}
}
An empty project named "CopyPackages" was added to the solution - it references all the packages and is the only one set to CopyLocal="true". No MSBuild knowledge required.
© Geeks with Blogs or respective owner