NuGet是个不错的东西,在项目中,NuGet都会将下载的文件保存在packages文件夹里
很多时候我并不想将所有的Package都上传到源代码管理中去。
但NuGet只提供了按Project去获取NuGet的方法。于是还是自己写一个工具来完成这个任务吧。
为了日后可以方便地集成到Build的过程中去,所以使用Msbuild的Task去做这件事会具有更好的扩展性。
一、首先,需要一个NuGet的MsBuild的Task包,这个NuGet已经提供了
http://nuget.codeplex.com/SourceControl/list/changesets
下载后编译使用NuGet.MSBuild.dll即可,另外还需要NuGet.Core.dll和NuGet.targets(编译后会和NuGet.MSBuild在一起)
二、packages文件夹中有repositories.config文件
这里面包含着所有引用有NuGet包的Project的路径,我们要解析这个文件,所以我决定使用MSBuild.Community.Tasks.dll(http://msbuildtasks.tigris.org/)
三、预备工作OK了,当然我们存放文件得有点规矩
lib\NuGet
lib\msbuild\ICSharpCode.SharpZipLib.dll
lib\msbuild\MSBuild.Community.Tasks.dll
lib\msbuild\MSBuild.Community.Tasks.Targets
lib\NuGet\NuGet.Core.dll
lib\NuGet\NuGet.MSBuild.dll
lib\NuGet\NuGet.targets
那么下面我们来搞定一个MsBuild的Project文件
1: <?xml version="1.0" encoding="utf-8"?>
2: <Project DefaultTargets="UpdateNuGet" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3: <PropertyGroup>
4: <LibFolder>$(MSBuildProjectDirectory)\Lib</LibFolder>
5: <OnlineSource>$(MSBuildProjectDirectory)</OnlineSource>
6: <NuGetRepositoryPath>$(OnlineSource)\packages</NuGetRepositoryPath>
7: <NuGetRepositoryConfig>$(NuGetRepositoryPath)\repositories.config</NuGetRepositoryConfig>
8: <NuGetSources>http://go.microsoft.com/fwlink/?LinkId=206669</NuGetSources>
9: </PropertyGroup>
10: <Import Project="$(LibFolder)\msbuild\MSBuild.Community.Tasks.Targets" />
11: <Import Project="$(LibFolder)\NuGet\NuGet.targets" />
12: <Target Name="UpdateNuGet">
13: <XmlRead XPath="//@path" XmlFileName="$(NuGetRepositoryConfig)">
14: <Output TaskParameter="Value" PropertyName="NuGetPackageFiles" />
15: </XmlRead>
16: <ItemGroup>
17: <_NuGetPackages Include="$(NuGetPackageFiles.Split(';'))" />
18: </ItemGroup>
19: <NuGetFetch PackageDir="$(NuGetRepositoryPath)"
20: PackageConfigFile="$([System.IO.Path]::GetFullPath($([System.IO.Path]::Combine($(NuGetRepositoryPath),%(_NuGetPackages.Identity)))))"
21: Sources="$(NuGetSources)"/>
22: </Target>
23: </Project>
将之存为UpdateNuGet.proj
四、接下来只有调用的问题了,我们可以通过批处理去调用
1: @echo Off
2: set config=%1
3: if "%config%" == "" (
4: set config=debug
5: )
6:
7: %WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild UpdateNuGet.proj
将之存为UpdateNuGet.bat这样我们就可以在获取代码之后,运行UpdateNuGet.bat来获取所有的NuGet Package了
当然我们也可以在Project编辑时设置BeforeBuild的事件来获取
下载所有文件(解压到解决方案根目录即可)