按Solution获取已经引用的NuGet的Package

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在一起)

image

二、packages文件夹中有repositories.config文件

image

这里面包含着所有引用有NuGet包的Project的路径,我们要解析这个文件,所以我决定使用MSBuild.Community.Tasks.dll(http://msbuildtasks.tigris.org/

image

三、预备工作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的事件来获取

 

下载所有文件(解压到解决方案根目录即可)

posted @ 2011-12-12 20:05  重典  阅读(5697)  评论(5编辑  收藏  举报