.NET世界的包管理器——Nuget
NugetServer 使用指南
为什么要使用Nuget
在我们的项目, 存在着一些公共Dll, 这些Dll被大量的项目所引用。同时这些公共dll也同时在进行版本升级, 由于缺乏版本管理,这些Dll会被到处Copy,导致各个项目所应用的版本不一致。
极端的情况是A项目和B项目都引用了一些Common Dll, 他们引用的Common Dll版本还可能不一致, 随着需求的变化,可能在某一天就会出现让A项目依赖B项目的情况。
这时我们就可能陷入dll版本陷阱中。如果我们有一个好的包管理器, 当管理器中的包升级的时候,依赖这个包的项目可以得到提示,那么我们就可以这简单地让我们的项目始终依赖最新的dll版本, 可以很自然的避免版本陷阱的发生。
在.net的世界里, 这个包管理器就是Nuget
Nuget Server搭建
Nuget Server的搭建十分简单, 微软已经为我们什么都准备好了。
- 在VS中创建一个Empty Web Application
- 选择Tools > Library Package Manager > Package Manager Setting,确认Package Manager的Package Sources已经添加nuget官方源:https://www.nuget.org/api/v2/,
VS2013以上版本应该已经集成。 - 在步骤1新建的Web Application中的Reference上右击, 选择Manage Nuget Package
- 在弹出的对话中, 选择Online Tab, 然后搜索NugetServer, 点击安装
- 修改web.config的requireApiKey=False, 或者设置requireApiKey=true,则必须设置apiKey,否则Push Package会报403错误
至此, 一个NugetServer就搞定了, 很简单吧?赶紧将Server部署起来吧!!!
添加Nuget Server Feed
记得在Nuget Server搭建部分讲的怎么确认nuget官方源是否已添加吗? 你已经知道怎么添加我们自己的Nuget Server源了吧。
添加好源之后, 只要把我们Nuget Package放到Server根目录的Packages的文件夹下,这个Package就可以被我们使用了
如何制作Nuget Package
在我们的项目里, 有两种dll我们需要利用Nuget来进行版本管理。
- 第三方Dll, 我们没有源码, 为了保证各个项目中引用的版本能够保持一致, 且能够同时得到更新,我们需要Nuget
- 我们自己产生的公共Dll, 大量的项目都在引用这些Dll, 我们也需要Nuget
在制作Nuget Package之前,我们需要下载Nuget.exe。
下载好之后将Nuget.exe存放的目录配置到环境变量里,以便PowerShell能够认识nuget Command
为第三方Dll制作Package
- 新建lib文件夹
- 将需要打包的dll放到lib文件夹下。放到lib文件夹下的目的是在使用Nuget添加引用后dll可以自动地添加到reference中
- 在DOS Console中将目录跳转到lib文件夹所在的目录,执行命令
Nuget Spec xxx.dll
- 上一步的命令会生成一个nuspec文件, 需要手动编辑这个文件,制定PackageID, Version等信息
- 执行
Nuget Pack xxx.dll.nuspec
即可 - 执行
Nuget Push [PackageID] -s [NugetServerUrl] [ApiKey]
推送到Nuget Server了
为Project制作Package
- 将目录跳转到Solution根目录
- 执行命令
Nuget Pack xxx.csproj -Build -Prop Configuration=Release -IncludeReferencedProjects
即可生成Package - 执行命令
Nuget Push [PackageID] -s [NugetServerUrl] [ApiKey]
推送到Nuget Server了
从Nuget Server引用Package
有两种方式:
- 通过Nuget Package Manager来引用
- 通过命令行来引用
这里讲几个常用命令行的操作, 通过Tools > Nuget Package Manager > Packge Manage Console, 打开Package Manage Console
- 查看可用的Package
Get-Package -AvailablePackage
- 安装Package
Install-Package [PackageID] [-Version]
- 更新Package
Update-Package
- 卸载Package
UnInstall-Package
- 清空本地nuget Package Cache
nuget locals all -clear
- 这些命令的具体用法,可以通过
Get-Help Command
查找帮助
一键打包一键发布
- 制作打包批处理
if exist $1*.nupkg del $1*.nupkg
nuget pack $2 -Build -Prop Configuration=Release -IncludeReferencedProjects -o $1 - 制作上传包文件到nuget server feed的批处理
nuget push $1*.nupkg -s [NugetServerURL] [ApiKey]
将[NugetServerURL]和[ApiKey]替换成你自己的NugetServerFeed地址和key
在Visual Studio的Project右键菜单上添加Pack Nuget Package和Publish Nuget Package菜单
- Tools 》External Tools... 添加External Command
- Tools 》 Cutomize... 》Commands 》Context menu... 》Project and Solution Context Menus | Project
- Add Command 》 Tools
- 选择External Command n, n就是你之前添加在External Tools中的External Command的是第几个这里的n就是几
Nuget Server是严格按照版本号来进行包管理的,如果同一个版本号的Package被多次被推送到Nuget Server Feed,后推送的会覆盖之前推送的版本。但是本地引用的Package还是没有更新,原因是因为在引用Nuget Server Feed上的Package的时候,不但会引用到Solution目录的packages目录下,同时也会被缓存在.nuget的公共缓存目录。多次推送一定要清空公共目录缓存,否则Solution下的packages文件夹中的Package不会被更新。
- 如果一个Solution下面包含的所有Project都要用Nuget来进行包管理,并且它们之间存在依赖关系,则应该按照依赖关系由弱到强的顺序进行打包并Push到Nuget Server。如果Pack的时候选择了IncludeReferencedProjects参数,引用关系强的Project会自动引用依赖关系弱的Project,前提是项目目录下要有nuspec文件,否则会直接将引用项目的dll包含到Package。
.NET世界的包管理器——Nuget的更多相关文章
- nuget包管理器控制台下的powershell脚本介绍
http://personball.com/powershell/2016/07/15/powershell-tips 定制自己的powershell,减少重复工作 安装一系列自己的常用nuget包 ...
- 详解.Net 如何上传自己的包到Nuget平台以及如何使用Nuget包管理器
首先需要一个Nuget账户,可以在官网注册:https://www.nuget.org.已有账户略. 需要一个ApiKeys,登录之后,在我的账户里找到ApiKeys进去; 创建ApiKeys 下载N ...
- [2016-07-15]nuget包管理器控制台下的powershell脚本介绍
博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...
- 华为云提供针对Nuget包管理器的缓存加速服务
在Visual Studio 2013.2015.2017中,使用的是Nuget包管理器对第三方组件进行管理升级的.而且 Nuget 是我们使用.NET Core的一项基础设施,.NET的软件包管理器 ...
- Visual Studio 2013 更新 NuGet 包管理器
Ø 前言 使用 Visual Studio 中的 NuGet 包管理器下载程序时,有时可能出现类似的错误:. 5. 在"联机"选项中搜索"NuGet",选 ...
- 当通过Nuget包管理器获取还原组时,出现 提示 “xxxxx”已拥有为“xxxxx”定义的依赖项
当通过Nuget包管理器获取还原组件时,出现 提示 “xxxxx”已拥有为“xxxxx”定义的依赖项 时 解决方法: 工具---扩展和更新,把Nuget包管理器卸载后,重启VS,再安装,现打开VS项 ...
- .NET持续集成与自动化部署之路第二篇——使用NuGet.Server搭建公司内部的Nuget(包)管理器
使用NuGet.Server搭建公司内部的Nuget(包)管理器 前言 Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基 ...
- VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战(原创)
VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战 1.给指定项目安装Newtonsoft.Json ,Version 4.5.11 PM> Install-Package Ne ...
- VS2013中Nuget程序包管理器控制台使用入门(二)-如何使用Nuget提供的帮助(原创)
如何使用Nuget提供的帮助? 1.从get-help Nuget开始,键入“get-help NuGet”以查看所有可用的 NuGet 命令. 用法: PM> get-help Nuget 主 ...
随机推荐
- jsp中文乱码解决办法
一.JSP页面显示乱码 二.表单提交中文时出现乱码 三.数据库连接 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到 的中文乱码的问题及解决办法写出来供 ...
- 判断闰年的Java算法
判断方法 普通年能被4整除且不能被100整除的为闰年. 世纪年能被400整除的是闰年 对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年.如172800年是闰年,86400年不 ...
- Flask系列05--Flask的配置config
一.flask配置 示例说明, 就是使用config进行配置 from flask import Flask app = Flask(__name__) # type:Flask app.conf ...
- API网关【gateway 】- 1
最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析. 网关的单节点场景: 网关的多节点场景: 这里的多节点是根据模块进 ...
- .NET Core 从1.1升级到2.0记录(Cookie中间件踩坑)
.NET Core 2.0 新时代 万众瞩目的.NET Core 2.0终于发布了,原定于9.19的dotnetconf大会的发布时间大大提前了1个月,.NET Core 2.0/.NET Stand ...
- mybatis四大接口之 ResultSetHandler
1. 继承结构 2. ResultSetHandler public interface ResultSetHandler { // 将Statement执行后产生的结果集(可能有多个结果集)映射为结 ...
- CSS中text-shadow的几个好看的文字demo及其代码
最近有看到一些镂空的或者立体的文字设计图非常好看,然后想了想,应该是使用text-shadow来实现的,这里我贴出我仿的八个demo,分享给大家 首先是HTML代码 <div class=&qu ...
- mybatis使用中的记录
一: 常用sql语句: sql顺序:select [distinct] * from 表名 [where group by having order by limit]; 查询某段时间内的数据: ...
- Apache Roller 5.0.3 XXE漏洞分析
下载5.0.2的版本来分析 5.0.2的war包地址 http://archive.apache.org/dist/roller/roller-5/v5.0.2/bin/roller-weblogge ...
- JS: 数组的循环函数
JS 数组相关的循环函数,用得挺多,所以有些坑还是要去踩一下,先来看一道面试题. 注意:下面提到的不改变原数组仅针对基本数据类型. 面试题 模拟实现数组的 map 函数. 心中有答案了吗?我的答案放在 ...