使用 NuGet 管理我们的程序集 - 预发行版
1、缘起
在我们的项目中。须要引用的组件统一放在一个 Libs 文件夹下。不管对于平台上的公共组件。还是应用模块,都是如此。
假设一个应用模块,比如能源管理(EM)。要引用平台提供的公共组件,比如数据库訪问(Platform.PL)。那么不但要把Platform.PL程序集复制到EM的Libs文件夹下,也要把Platform.PL所引用的程序集。也就是Platform.PL的Libs文件夹下的文件。复制到EM的Libs文件夹下。
随着平台上应用模块的增多,Platform.PL被引用得也越来越多。我们是怎么把Platform.PL自身及其Libs下的程序集给到这些应用模块的呢?是通过手工拷贝的方式。
那么问题来了——Platform.PL升级了怎么办?答案是,仅仅能一一手工拷贝了。
这样的做法非常老土,并且由于手工拷贝,easy出错。最好是把共用组件放到server上,应用模块引用或升级时就去server上下载或更新。实际上,业界已经这么做非常久了。就是用 NuGet 获取程序集。
仅仅是这些程序集普通情况下都是公开的,比如 NHibernate、Spring.Net等等。我们能够使用 NuGet 的机制,并且把共用的程序集放到内部的server上。
因此,这里介绍的,不是怎么用 NuGet 来管理一个解决方式所使用的程序集,而是怎么把我们自己开发的公共组件放到内部的server上,让其它模块下载、更新。
顺带说一下开发环境,当然是 .NET 了,Visual Studio的版本号是 2012。这个版本号已经缺省安装了 NuGet 包管理器。
2、准备待公布的程序集
开发好公共组件后。要将其公布到 NuGet server上,须要做些准备工作。
0. 下载 NuGet.exe。地址在这里。这是一个控制台程序,以后要在命令行以下执行。下载后。将其放到一个合适的位置,并用path指向这个位置。当然,这个文件仅仅须要下载一次。
1. 创建清单文件。
打开命令行程序。进入公共组件所在项目的目录,执行 nuget spec。
就像以下这样:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
这样就会创建一个文件:Platform.PL.nuspec。打开这个文件,会看到是这个样子的:
<? xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
<projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
<iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2014</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
</package>
当中有些内容是不须要的,能够删除它。licenseUrl。projectUrl,iconUrl,都能够删掉,反正它提示我们删掉。
releaseNotes和tags一定要改动。否则下一步会出现警告。
比如,我把这个文件改动成这样:
<? xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>MES平台数据库訪问组件首次公布到NuGetserver上</releaseNotes>
<copyright>Copyright 2014</copyright>
<tags>MES平台 数据库訪问</tags>
</metadata>
</package>
2.打包。在上面的命令行界面下,执行 nuget pack,像以下这样:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
这样就会创建一个文件 Platform.PL.xyz.nupkg。这就是我们将要公布到NuGetserver上的包。
有一种情况值得一提:由于某种原因,我们不得不使用spring.net的预发行版(pre-release)。好奇么?这个原因就是,spring.net在并发环节使用了Dictionary,而这个类不是线程安全的,导致在执行时出现故障。spring.net在预发行版 2.0.0-RC1攻克了这一问题,但还没有出稳定(Stable)版。所以我们就使用这个预发行版了。
nuget有一项规定:假设使用了非稳定版的程序集,所公布的程序集就不能是稳定版本号。否则,打包是就会出现这种错误:
为此。须要将我们要公布的包设置为測试版或预发行版。做法是手工编辑所在项目的 Properties/AssemblyInfo.cs 文件:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
当中的36行就是我们加进去的。
3、将程序集公布到内部server上
经过上一步。我们生成了要公布的包:Platform.PL.3.1.0-alpha.nupkg。
这个包能够公布到公共的NuGetserver上,供全部人下载。但如今我们不想这么做。我们仅仅是公布到内部server上,仅供项目组内部使用。
要做到这一点,我们首先要创建一个站点。用常规的方法创建IIS站点,能够给这个站点起名为 NuGetServer。
其次,我们要创建一个Web应用。
利用VS,创建一个 ASP.NET空Web应用程序。
能够给这个项目起名为 NuGetServer。
再次,在这个应用程序中,用 NuGet 加入 NuGet.Server 包引用:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
引用了NuGet.Server包以后。会自己主动增加非常多它引用的包。
再再次,将我们刚创建的 Platform.PL.3.1.0-alpha.nupck 文件,增加到这个Web项目的packages目录中:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
最后,将这个应用公布到站点 NuGetServer 中就能够了。
公布成功后,打开这个站点,能够看到类似这种内容:
4、引用程序集
将程序集在内部NuGetserver上公布成功后,就能够将其引用到应用模块中了。
在应用模块引用之前,还须要做一件准备工作:将server加入到NuGet配置中。
在VS 2012中,点击菜单 工具 --> NuGet程序包管理器 --> 管理解决方式的NuGet程序包,在弹出的对话框中,点击左下角的“设置”button,会弹出“选项”对话框。点击右上角的大加号,能够加入“可用程序包源”,将上面ie提示的地址。如http://localhost:8010/nuget。加入上去就能够了。能够起名字为mes:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
至此,就能够像从公共NuGetserver上下载程序集一样。从内部的NuGetserver上下载我们自己的程序集了。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHh0YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
5、其他
这个帖子的标题带有“预发行版”。表示这个做法刚实验通过。真正用起来。应该会面临诸多意想不到的问题。即便如此,也推荐使用。
建议我们的项目组:
1、摈弃用Libs管理所引用的程序集。转用 NuGet 下载程序集的方式;
2、MES平台搭建统一的 NuGet server;
3、公共组件统一公布到 NuGet server上,并參考语义化版本号的方式设置版本号号。
使用 NuGet 管理我们的程序集 - 预发行版的更多相关文章
- Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用
带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了 project.json 这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...
- .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件
系列目录 [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...
- linux 各种发行版及包管理器的关系
linux 各种发行版及包管理器的关系 Linux发行版列表 基于Kpkg(Debian 系) Debian GNU / Linux 及其派生发行版使用deb软件包格式,并使用dpkg及其前端作为包管 ...
- Nuget 命令 NuGet 管理项目库
因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在"程序包管理器控制台"中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项目的目标 ...
- 【转】使用 NuGet 管理项目库-Phil Haack
原文地址:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 ...
- 使用 NuGet 管理项目库
使用 NuGet 管理项目库 Phil Haack 本文转载自:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Micros ...
- [转载]使用 NuGet 管理项目库
原文:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Mi ...
- 【VS开发】使用 NuGet 管理项目库
NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Microsoft 在全球的员工人数接近 90,000, ...
- 使用NuGet管理项目类库引用
NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2012 ,VS2013中默认集成了N ...
随机推荐
- mongodb导出数据csv格式
mongoexport -d test -c item --type=csv -f salary,city,workYear,companyShortName -o user.csvmongoexpo ...
- Linux进程托管与守护进程设置
引言 在上一篇<Linux启动之旅>中,我们了解了Linux启动过程,在该过程的最后一步,init进程拉起/etc/init.d/rcN.d/目录下指定的守护进程(daemon).假若自定 ...
- 公共语言运行库(CLR)开发系列课程(3):COM Interop基础 学习笔记
上章地址 什么是COM Component Object Model 组建对象模型 基于接口(Interface) 接口=协议 IID 标识接口 V-table 虚表 方式调用 单继承 对象(Obje ...
- ajax请求成功但不执行success-function回调函数的问题
在success:function(data){}下面加个error:function(){},看看是不是出错了走了error.如果是,说明返回值类型不符合要求. 比如:下面代码返回String类型. ...
- springcloud使用使用Feign-Ribbon做负载均衡实现声明式REST调用
什么是Feign Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解 ...
- JQ实现弹幕效果
JQ实现弹幕效果,快来吐糟你的想法吧 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charse ...
- 实操一下<python cookbook>第三版1
这几天没写代码, 练一下代码. 找的书是<python cookbook>第三版的电子书. *这个操作符,运用得好,确实少很多代码,且清晰易懂. p = (4, 5) x, y = p p ...
- kgtemp文件转mp3工具
kgtemp文件是酷我音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名. kgtemp解密 kgtemp文件前1024个字节是固定的包头信息,解密方案详细 ...
- VSCode配置简单的vue项目
VSCode配置简单的vue项目 https://www.cnblogs.com/wnxyz8023/p/9989447.html 由于最近要使用的项目框架为前后端分离的,采用的是vue.js+web ...
- 按行拆分文本文件与合并文本文件---I/O流---java
背景 在进行自然语言处理的中文词性标注时 进行测试时由于测试数据文本行数较多 而且测试每次标注一行的用时稍长 如果一次将文件读进来测试机器运行时间要连续不能中断 而且 只能一台机器进行工作 于 ...