按解決方案獲取已經通過NuGet引用的Package

按解決方案獲取已經通過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的路徑,我們要讀取這個XML檔,所以我決定使用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的事件來獲取

 

下載所有檔(解壓到解決方案根目錄即可)