MSBuild task to restore Nuget content files to project folder
MSBuild.NugetContentRestore takes care of copying your Nuget content files to your project folder. This is helpful specially for HTML front-end packages like angularjs, bootstrap or any Nuget package that contains a Content folder.
During installation of the front-end package (using Install-Package), all Package Content are copied to your project folder. The problem is that, in general, you don't want to check these files into your revision control system like git or svn. You would expect that "nuget restore" will also take care of copying the content files but this is not the case. This issue has been repetitively reported here:
And Jeff Handley explained why this is not the case here:
Other interesting solution to workaround this issue is available here:
I wanted to keep things simpler and let the project take care of the hard work.
To install MSBuild.NugetContentRestore, run the following command in the Package Manager Console:
PM> Install-Package MSBuild.NugetContentRestore
More information about MSBuild.NugetContentRestore NuGet Package available at https://www.nuget.org/packages/MSBuild.NugetContentRestore/
After installing MSBuild.NugetContentRestore using NuGet, your Visual Studio Project (.csproj, .vbproj) will have a reference to MSBuild.NugetContentRestore Task. Starting on version 0.1.4, I added an install.ps1 and uninstall.ps1 to take care of adding NugetContentRestoreTask to a BeforeBuild Target.
All NuGet Packages Content Folders will be copied to your project folder right before is built.
Remember to manually ignore the content folders (~/ProjectFolder/Scripts, Content, Fonts, Images) in your revision control software.
Additional Folders Syntax
To include folders other than the defaults (Scripts, Images, contents, fonts), one must edit the csproj entry (added during the install of this package) with the extra parameter "AdditonalFolders". Each additonal folder should be separated with a semi colon (';').
An example of two extra folders (content/static, content/Views) being included to the content restore task:
<NugetContentRestoreTask AdditionalFolders="static;Views" SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" />
SmartRestore detects if a file has changed in the source (package folders) compared to a target file (based on file date only). If it hasn't changed, it will skip the file copy, which for packages with large content folders, can significantly improve Visual Studio build performance. In one large sample, content restore time reduced from 20 seconds down to 2 seconds.
SmartRestore is enabled by default.
To disable SmartRestore, add the
EnableSmartRestore="false" attribute to the content restore task.
The MIT License (MIT)
Copyright (c) 2016, Francisco Lopez
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.