你的团队需要一个正确的程序集(dll)管理姿势
很多团队经历时间的积淀之后,都会有很多的可重用的公共技术组件。大部分的团队都会把这些公共组件生成程序集(dll)后,放到GIT或SVN的一个公共目录里面,以供各个项目中使用。起初在项目很少又或者是公共组件不多的时候,这样看起来也没有多大问题。但是随着团队越来越大,项目的组件增多,所封装的可重用组件越来越多,一些问题就会慢慢暴露出来。这个时候如果还是使用这种方式去管理程序集,显然就不太合适了。
我们知道,在Java中比较常用的包管理工具,如Maven。实际上在很多大公司里面都会搭建自己公司的Maven私服,以管理公司的一些公共技术组件。
实际上在.net中也有,大家也绝对不陌生,就是Nuget, 相信每个人都从官方的nuget服务器上下载过一些第三方组件,如:log4net、quartz.net等等。
Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工作变得更加快捷方便。这是维基百科中的定义,实际上Nuget就是一个包管理器,类似于Java的Maven,可以帮助我们更方便的管理dll,这也是微软提供给.net平台的一个正确的包管理工具。
而如Maven一样,Nuget也可以搭建自己的私服。这篇文章就来简单介绍一下如何搭建属于你们团队自己的Nuget服务器。
一、下载Nuget.Server
从官方Nuget服务器上搜索nuget.server,点击项目url中的github路径。从github中下载nuget.server的源码。

下载并解压后的文件路径如下图所示:

二、搭建Nuget.Server
- 打开项目文件NuGet.Server.sln,找到NuGet.Server,右键发布,选择文件系统(跟发布web程序一样,发布到IIS中)。

- IIS新建站点MyNuGet

启动程序出现以下页面代表搭建成功

- 注意:若点击here出现404页面如下图所示:

可以通过VS运行起来Nuget.Server项目,然后将bin目录替换IIS下的bin目录,即可解决。出现下图代表搭建成功

打开VS的Nuget管理器,点击图中设置图标,新建我们自己的nuget服务器

之后就可以连上我们自己搭建的服务器了

三、自建NuGet基本使用
下载NuGet命令行打包工具nuget.exe
下载地址:https://www.nuget.org/downloads打包我们程序
- 方式1:通过类库文件csproj的方式打包
首先打开我们程序的AssemblyInfo.cs文件修改程序集信息

使用nuget.exe打包程序集
在.csproj文件目录下执行命令spec
nuget.exe spec //spec 在.csproj文件目录下执行命令

此时会生成一个.nuspec文件,打开这个文件
修改其中的xml属性即可(注意此处一些信息最好和AssemblyInfo.cs中的程序集信息一致)

修改完成后继续执行pack命令

这时将生成的.nupkg文件直接copy到nuget服务器IIS目录下的packages文件夹内即可
也可通过命令push推送至nuget服务器
nuget push *.nupkg -s http://127.0.0.1:8005 123456 //push 程序包路径 选项 地址 apikey
//apikey 可以在服务器webconfig中配置
完成后即可查看或使用我们发布的程序集


四、问题
如果你认为以上就结束了,那你就太天真了,实际上,我们团队在搭建与使用过程中还是遇到了很多问题的,如果搭建使用中踩到了同样的坑可以参考下面几点。
- 在刚开始使用的时候经常因为失误或者程序有问题从而导致需要重新发布nuget包,但是发现覆盖掉原来的之后,项目里更新下来的始终还是原来的程序。
解决:慎重慎重再慎重打包,需要重新发布包的时候可以升级,不能覆盖。(当时认为这个东西只能升级不能覆盖) - 用了一段时间后,由于当时至提供了nuget管理包的技术方案,却没有相应的使用规范与制度,导致团队nuget包混乱,开发人员胡乱升级,胡乱引用nuget包,终于有一天造成大问题。因此需要制定一个完善的使用规范与制度,包括如何打包,如何发布,谁来打包,谁来发布,慎重打包、升级、专人管理等
- 由于问题2引起的问题,因此决定重新整理nuget包(不破不立),于是重新搭建了一个nuget服务器,重新规整虽有的程序集、组件、重新打包发布等,但是发现迁移到新的后,项目中下载下来的程序集还是原来的。(又遇到了问题1)。这次灵感一来发现问题解决方案。VS2017通过工具->选项->清除所有NuGet缓存 再重新下载包问题即可解决

若没有VS2017或找不到清楚NuGet缓存选项,也可找到自己机器上nuget的缓存文件夹删除掉里面对应的内容也可以,一般是在C:\Users\Administrator.nuget

小结
今天简单介绍了如何搭建自己团队的Nuget服务器,以及如何打包并发布程序集到Nuget。实际上,大多数的.net团队仍然是在用SVN或GIT的方式去管理dll,包括我所在的某大厂,虽然后来框架研发部,提供了一个自主研发的管理工具,但我个人感觉还是不如Nuget更好用一些。
如果你的团队不满足现在的程序集管理方式,那么不妨换个姿势,搭建一个属于你们团队自己的Nuget服务器吧!当然,如果你有更好的方式,欢迎与我留言分享!
你的团队需要一个正确的程序集(dll)管理姿势的更多相关文章
- 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项 看到这个异常,我估计谁都会头大一阵子,不过还好,由于前面知道要设置为x86,加上以前观察过I ...
- 异常:System.BadImageFormatException,未能加载正确的程序集XXX
IDE:VS2015 语言:C# 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项... 一般是由于目标程序的目标平台与其某一依赖项的目标编 ...
- js替换全部,js检查输入的日期是否是一个正确的日期格式
<script language="javascript"> var str = "我爱的人和爱我的人,我爱的人和爱我的人"; var newstr ...
- BadImageFormatException,未能加载正确的程序集XXX的解决办法
BadImageFormatException,未能加载正确的程序集XXX的解决办法 IDE:VS2010 语言:C# 异常:System.BadImageFormatException,未能加载正确 ...
- 移动端页面 iPhone + Safari 页面调试 之 正确查看网络请求的姿势
如题 本文主要将 Safari + iPhone 前端开发调试 之 正确查看网络请求的 姿势 惯例 说下问题场景: 早知道safari(Mac) + iPhone 调试的方便 能解决很多日常调试问题 ...
- VC 下如何正确的创建及管理项目
讲解 VC 下如何正确的创建及管理项目 本文讲解 Visual C++ 的项目文件组成,以及如何正确的创建及管理项目. 本文所设计的内容是初学者必须要掌握的.不能正确的管理项目,就不能进一步写有规模的 ...
- 比较.NET程序集(DLL或EXE)是否相同
如何比较两个.NET程序集(DLL或EXE)是否相同呢? 直接比较文件内容?当然没那么简单了,这个你可以去试试,去比较一下两次Build产生的程序集, 就算内容没有改变,产生的程序集的二进制文件也是不 ...
- Windows下用Codeblocks建立一个最简单的DLL动态链接库
转自:http://blog.csdn.net/wangwei_cq/article/details/8187576 来源:http://hi.baidu.com/hellosim/item/9ae4 ...
- laravel学习:php写一个简单的ioc服务管理容器
php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...
随机推荐
- Mark down 使用总结
Markdown语法 Markdown是一种纯文本.轻量级的标记语言,通过简单的标记,就可以使文本具有一定的格式,操作简单.使用广泛,常见的比如github上的README.md . Markdown ...
- Os-hackNos-1靶机过关记录
靶机地址:172.16.1.198(或112) kali地址:172.16.1.108 1 信息收集 靶机界面如下 简单查看 OS:Ubuntu Web:Apache2.4.18 尝试端口扫描 开放 ...
- [数据库]Mysql蠕虫复制增加数据
将查询出来的数据插入到指定表中,例: 将查询user表数据添加到user表中,数据会成倍增加 insert into user(uname,pwd) select uname,pwd from use ...
- 【题解】P4570 [BJWC2011]元素 - 线性基 - 贪心
P4570 [BJWC2011]元素 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 给你 \(n\) 个二元组 \( ...
- 【python】显示图片 并随意缩放图片大小 图片归一化
cv2.namedWindow("image_",0) cv2.imshow("image_",image)就可以随意缩放显示图片的窗口大小啦. ------ ...
- Ansible Facts 变量详解
Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...
- JS 获取浏览器
function getInfo() { var s = ""; s = " 网页可见区域宽:" document.body.clientWidth; s = ...
- 前端面试题之HTML和css-很实用的知识点
display: none; 与 visibility: hidden; 的区别 相同: 它们都能让元素不可见 区别: display:none;会让元素完全从渲染树中消失,渲染的时候不占据任何空间: ...
- 0day学习笔记(3)Windows定位API引起的惨案(原理)
段选择器FS与TEB WinNT内核下内存采用保护模式,段寄存器的意义与实模式汇编下的意义不同.另外,FS存的是段选择子,而不是实模式下的高16位基地址. FS寄存器指向当前活动线程的TEB结构(线程 ...
- Openstack Swift 创建用户和 container
openstack user create --domain default --password-prompt [用户名];openstack role add --project admin - ...