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的事件来获取

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

  • 相关阅读:
    The analysis of China's holding the Olympic Games
    ASP.NET获取客户端的操作系统、浏览器、.NET版本等信息(图)
    ASP.NET 无提示关闭窗口
    VC 使用CryptoAPI计算Hash值:MD5, SHA
    SQL Server 2005 中设置某个用户对某一个数据库有完全控制的权限
    C# 计算文件的MD5值
    VC 获取物理网卡的MAC地址
    哪些免费邮箱不在邮件内容里插广告?
    忆同学
    使用正则表达式获取连接字符串某项的值
  • 原文地址:https://www.cnblogs.com/chsword/p/nuget_update_task.html
Copyright © 2011-2022 走看看