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

简介: NuGet是个不错的东西,在项目中,NuGet都会将下载的文件保存在packages文件夹里 很多时候我并不想将所有的Package都上传到源代码管理中去。 但NuGet只提供了按Project去获取NuGet的方法。

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

 

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

目录
相关文章
|
5月前
|
存储 Java 编译器
Java编程中,包声明(Package Declaration)
Java编程中,包声明(Package Declaration)
90 1
|
14天前
idea创建Package时出现包名累加,而不是树形结构解决方法
idea创建Package时出现包名累加,而不是树形结构解决方法
|
6月前
|
Java Maven
idea中maven打包工具类 repackage failed: Unable to find main class
idea中maven打包工具类 repackage failed: Unable to find main class
85 1
|
11月前
|
IDE Go 开发工具
Go源码里为什么可以直接用internal包里的func?
Go源码里为什么可以直接用internal包里的func?
53 0
ROS学习-编译Package包
ROS学习-编译Package包
88 0
|
Unix Shell Windows
CMake教程11:find_package
CMake教程11:find_package
341 0
|
存储 Java 数据安全/隐私保护
java包(package)
1.包的概念 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。 包的作用 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。 Java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等✨
74 0
java包(package)
|
程序员 Android开发
使用 Eclipse 建立包的时候,“name”下可选项“Create package-info.java”的作用是什么?
使用 Eclipse 建立包的时候,“name”下可选项“Create package-info.java”的作用是什么?
使用 Eclipse 建立包的时候,“name”下可选项“Create package-info.java”的作用是什么?
|
Serverless 对象存储
Fun Package 功能介绍
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。
1738 0