按解決方案獲取已經通過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在一起)
二、packages資料夾中有repositories.config檔
其內部包含所有引用有NuGet包的Project的路徑,我們要讀取這個XML檔,所以我決定使用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的事件來獲取
下載所有檔(解壓到解決方案根目錄即可)