We have a framework that is split up into lots of separate projects in one solution. I now want to create NuGet packages for each separate project, but guarantee that only one version of the framework can be used in one solution (possibly across several projects).
For example, say the framework is made up of two projects:
Framework
Framework_1
Framework_2
Now when using this framework one project might reference Framework_1
, while another project references Framework_2
. I want to make sure that both packages have the same version (bonus points if there's an easy single-step process to upgrade to a newer version)
I thought I would just define one solution level Framework package that all other packages depend on strictly. The problem is that NuGet has no problems simply installing several versions of the solution level package.
Basically I tried the following:
Solution-level nuspec file:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>My.Framework</id>
<version>1.0.0</version>
<title>My.Framework</title>
<authors>voo</authors>
<owners>voo</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Some Framework Solution Package</description>
<copyright>Copyright © 2015</copyright>
</metadata>
</package>
And one nuspec package for one part:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>My.Framework.BL</id>
<version>1.0.0</version>
<title>My.Framework.BL</title>
<authors>voo</authors>
<owners>voo</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Business Layer</description>
<copyright>Copyright © 2015</copyright>
<dependencies>
<dependency id="My.Framework" version="[1.0.0]"/>
</dependencies>
</metadata>
</package>
The problem now is if I tried to install, say another My.Framework.EF
package with version 1.0.1
and an explicit dependency on My.Framework
1.0.1 Visual Studio
would just install My.Framework
twice - once with version 1.0.0 and once with 1.0.1.
It turns out that you can call
Install-Package $package.Id -version <someVersion>
inside Install.ps1 which will then cause the originally installed version to be uninstalled and the specified version to be installed.A slightly simplified version is the following: