很多团队经历时间的积淀之后,都会有很多的可重用的公共技术组件。大部分的团队都会把这些公共组件生成程序集(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

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

  2. IIS新建站点MyNuGet



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

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



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



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



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

三、自建NuGet基本使用

  1. 下载NuGet命令行打包工具nuget.exe

    下载地址:https://www.nuget.org/downloads

  2. 打包我们程序

  • 方式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中配置

完成后即可查看或使用我们发布的程序集

四、问题

如果你认为以上就结束了,那你就太天真了,实际上,我们团队在搭建与使用过程中还是遇到了很多问题的,如果搭建使用中踩到了同样的坑可以参考下面几点。

  1. 在刚开始使用的时候经常因为失误或者程序有问题从而导致需要重新发布nuget包,但是发现覆盖掉原来的之后,项目里更新下来的始终还是原来的程序。

    解决:慎重慎重再慎重打包,需要重新发布包的时候可以升级,不能覆盖。(当时认为这个东西只能升级不能覆盖)
  2. 用了一段时间后,由于当时至提供了nuget管理包的技术方案,却没有相应的使用规范与制度,导致团队nuget包混乱,开发人员胡乱升级,胡乱引用nuget包,终于有一天造成大问题。因此需要制定一个完善的使用规范与制度,包括如何打包,如何发布,谁来打包,谁来发布,慎重打包、升级、专人管理等
  3. 由于问题2引起的问题,因此决定重新整理nuget包(不破不立),于是重新搭建了一个nuget服务器,重新规整虽有的程序集、组件、重新打包发布等,但是发现迁移到新的后,项目中下载下来的程序集还是原来的。(又遇到了问题1)。这次灵感一来发现问题解决方案。VS2017通过工具->选项->清除所有NuGet缓存 再重新下载包问题即可解决



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

小结

今天简单介绍了如何搭建自己团队的Nuget服务器,以及如何打包并发布程序集到Nuget。实际上,大多数的.net团队仍然是在用SVN或GIT的方式去管理dll,包括我所在的某大厂,虽然后来框架研发部,提供了一个自主研发的管理工具,但我个人感觉还是不如Nuget更好用一些。

如果你的团队不满足现在的程序集管理方式,那么不妨换个姿势,搭建一个属于你们团队自己的Nuget服务器吧!当然,如果你有更好的方式,欢迎与我留言分享!

你的团队需要一个正确的程序集(dll)管理姿势的更多相关文章

  1. 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项

    常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项 看到这个异常,我估计谁都会头大一阵子,不过还好,由于前面知道要设置为x86,加上以前观察过I ...

  2. 异常:System.BadImageFormatException,未能加载正确的程序集XXX

    IDE:VS2015 语言:C# 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项... 一般是由于目标程序的目标平台与其某一依赖项的目标编 ...

  3. js替换全部,js检查输入的日期是否是一个正确的日期格式

    <script language="javascript"> var str = "我爱的人和爱我的人,我爱的人和爱我的人"; var newstr ...

  4. BadImageFormatException,未能加载正确的程序集XXX的解决办法

    BadImageFormatException,未能加载正确的程序集XXX的解决办法 IDE:VS2010 语言:C# 异常:System.BadImageFormatException,未能加载正确 ...

  5. 移动端页面 iPhone + Safari 页面调试 之 正确查看网络请求的姿势

    如题 本文主要将 Safari + iPhone 前端开发调试  之 正确查看网络请求的 姿势 惯例 说下问题场景: 早知道safari(Mac) + iPhone 调试的方便 能解决很多日常调试问题 ...

  6. VC 下如何正确的创建及管理项目

    讲解 VC 下如何正确的创建及管理项目 本文讲解 Visual C++ 的项目文件组成,以及如何正确的创建及管理项目. 本文所设计的内容是初学者必须要掌握的.不能正确的管理项目,就不能进一步写有规模的 ...

  7. 比较.NET程序集(DLL或EXE)是否相同

    如何比较两个.NET程序集(DLL或EXE)是否相同呢? 直接比较文件内容?当然没那么简单了,这个你可以去试试,去比较一下两次Build产生的程序集, 就算内容没有改变,产生的程序集的二进制文件也是不 ...

  8. Windows下用Codeblocks建立一个最简单的DLL动态链接库

    转自:http://blog.csdn.net/wangwei_cq/article/details/8187576 来源:http://hi.baidu.com/hellosim/item/9ae4 ...

  9. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

随机推荐

  1. F - Make It Equal CodeForces - 1065C

    题目大意:有n座塔,塔高h[i],每次给定高度H对他们进行削切,要求每次削掉的所有格子数不能超过k个,输出最少削几次才能使所有塔的高度相同. 思路一:差分+贪心 对于每一个高度h,用一个数组让1~h的 ...

  2. 爬虫实战2_有道翻译sign破解

    目标url 有道翻译 打开网站输入要翻译的内容,一一查找network发现数据返回json格式,红框就是我们的翻译结果 查看headers,发现返回结果的请求是post请求,且携带一大堆form_da ...

  3. PHP函数:memory_get_usage

    memory_get_usage()  -返回分配给 PHP 的内存量 说明: memory_get_usage ([ bool $real_usage = false ] ) : int 参数: r ...

  4. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  5. python 工具链 虚拟环境和包管理工具 pipenv

    Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, ...

  6. PHP Ajax 跨域问题解决方案

    本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.0751.tv,而请求的域名是server.0751.tv. 如果直接使用ajax访问 ...

  7. XSS Challenge(2)

    XSS Challenges http://xss-quiz.int21h.jp/ Stage #13 Hint:style attribute:要用到style属性,在style属性中有个expre ...

  8. 2019-2020-1 20199329《Linux内核原理与分析》第三周作业

    <Linux内核原理与分析>第三周作业 一.上周问题总结: 第二周头脑风暴完成较慢 虚拟机libc配置错误 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境虚拟一个x86的CPU硬 ...

  9. vue中递归组件的使用

    2019独角兽企业重金招聘Python工程师标准>>> 递归 简单来讲就是程序自己调用自身. vue中的递归组件就是,组件自身调用自身. 父组件 <template> & ...

  10. ReentrantReadWriteLock及共享锁的实现

    介绍 ReentrantReadWriteLock是j.u.c包下提供的ReadWriteLock接口的实现. ReadWriteLock作为读写锁,提供了返回读锁和返回写锁两个方法. /** * 读 ...