zoukankan      html  css  js  c++  java
  • 按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的事件来获取

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

  • 相关阅读:
    第二阶段冲刺站立会议03
    第二阶段冲刺会议02
    第二阶段冲刺站立会议01(附第12周进度条)
    课堂练习,找水王(附第十一周进度条)
    输入法的评价
    描绘用户场景并将典型用户和用户场景描述(附第十周进度条)
    每日站立会议09,10
    第九周进度条
    团队报告
    个人记账软件(团队成员介绍和软件介绍)
  • 原文地址:https://www.cnblogs.com/chsword/p/nuget_update_task.html
Copyright © 2011-2022 走看看