使用 NuGet 管理我们的程序集 - 预发行版

1、缘起

在我们的项目中,需要引用的组件统一放在一个 Libs 目录下。无论对于平台上的公共组件,还是应用模块,都是如此。

如果一个应用模块,例如能源管理(EM),要引用平台提供的公共组件,例如数据库访问(Platform.PL),那么不但要把Platform.PL程序集拷贝到EM的Libs目录下,也要把Platform.PL所引用的程序集,也就是Platform.PL的Libs目录下的文件,拷贝到EM的Libs目录下。

随着平台上应用模块的增多,Platform.PL被引用得也越来越多。我们是怎么把Platform.PL自身及其Libs下的程序集给到这些应用模块的呢?是通过手工拷贝的方式。

那么问题来了——Platform.PL升级了怎么办?答案是,只能一一手工拷贝了。

这种做法很老土,而且因为手工拷贝,容易出错。最好是把共用组件放到服务器上,应用模块引用或升级时就去服务器上下载或更新。实际上,业界已经这么做很久了,就是用 NuGet 获取程序集。只是这些程序集一般情况下都是公开的,例如 NHibernate、Spring.Net等等。我们可以使用 NuGet 的机制,并且把共用的程序集放到内部的服务器上。

因此,这里介绍的,不是怎么用 NuGet 来管理一个解决方案所使用的程序集,而是怎么把我们自己开发的公共组件放到内部的服务器上,让其他模块下载、更新。

顺带说一下开发环境,当然是 .NET 了,Visual Studio的版本是 2012。这个版本已经缺省安装了 NuGet 包管理器。

2、准备待发布的程序集

开发好公共组件后,要将其发布到 NuGet 服务器上,需要做些准备工作。

0. 下载 NuGet.exe。地址在这里。这是一个控制台程序,以后要在命令行下面运行。下载后,将其放到一个合适的位置,并用path指向这个位置。当然,这个文件只需要下载一次。

1. 创建清单文件。打开命令行程序,进入公共组件所在项目的文件夹,运行 nuget spec。就像下面这样:

这样就会创建一个文件: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平台数据库访问组件首次发布到NuGet服务器上</releaseNotes>
    <copyright>Copyright 2014</copyright>
    <tags>MES平台 数据库访问</tags>
  </metadata>
</package>

2.打包。在上面的命令行界面下,运行 nuget pack,像下面这样:

这样就会创建一个文件 Platform.PL.xyz.nupkg。这就是我们将要发布到NuGet服务器上的包。

有一种情况值得一提:因为某种原因,我们不得不使用spring.net的预发行版(pre-release)。好奇么?这个原因就是,spring.net在并发环节使用了Dictionary,而这个类不是线程安全的,导致在运行时出现问题。spring.net在预发行版 2.0.0-RC1解决了这一问题,但还没有出稳定(Stable)版,所以我们就使用这个预发行版了。nuget有一项规定:如果使用了非稳定版的程序集,所发布的程序集就不能是稳定版本。否则,打包是就会出现这样的错误:

为此,需要将我们要发布的包设置为测试版或预发行版,做法是手工编辑所在项目的 Properties/AssemblyInfo.cs 文件:

其中的36行就是我们加进去的。

3、将程序集发布到内部服务器上

经过上一步,我们生成了要发布的包:Platform.PL.3.1.0-alpha.nupkg。这个包可以发布到公共的NuGet服务器上,供所有人下载。但现在我们不想这么做,我们只是发布到内部服务器上,仅供项目组内部使用。

要做到这一点,我们首先要创建一个网站,用常规的方法创建IIS网站,可以给这个网站起名为 NuGetServer。

其次,我们要创建一个Web应用。利用VS,创建一个 ASP.NET空Web应用程序。可以给这个项目起名为 NuGetServer。

再次,在这个应用程序中,用 NuGet 添加 NuGet.Server 包引用:

引用了NuGet.Server包以后,会自动加入很多它引用的包。

再再次,将我们刚创建的 Platform.PL.3.1.0-alpha.nupck 文件,加入到这个Web项目的packages文件夹中:

最后,将这个应用发布到网站 NuGetServer 中就可以了。

发布成功后,打开这个网站,可以看到类似这样的内容:

4、引用程序集

将程序集在内部NuGet服务器上发布成功后,就可以将其引用到应用模块中了。在应用模块引用之前,还需要做一件准备工作:将服务器添加到NuGet配置中。

在VS 2012中,点击菜单 工具 --> NuGet程序包管理器 --> 管理解决方案的NuGet程序包,在弹出的对话框中,点击左下角的“设置”按钮,会弹出“选项”对话框,点击右上角的大加号,可以添加“可用程序包源”,将上面ie提示的地址,如http://localhost:8010/nuget,添加上去就可以了。可以起名字为mes:

至此,就可以像从公共NuGet服务器上下载程序集一样,从内部的NuGet服务器上下载我们自己的程序集了。

5、其它

这个帖子的标题带有“预发行版”,表示这个做法刚实验通过。真正用起来,应该会面临诸多意想不到的问题。即便如此,也推荐使用。

建议我们的项目组:

1、摈弃用Libs管理所引用的程序集,转用 NuGet 下载程序集的方式;

2、MES平台搭建统一的 NuGet 服务器;

3、公共组件统一发布到 NuGet 服务器上,并参考语义化版本的方式设置版本号。



时间: 2024-10-12 14:53:53

使用 NuGet 管理我们的程序集 - 预发行版的相关文章

【转】使用 NuGet 管理项目库-Phil Haack

原文地址:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Microsoft 在全球的员工人数接近 90,000,但全球的开发人员数以百万计. 指望 Microsoft 满足每一个人的需求是不现实的,也不可想像.因此,开发人员通常得自己动手解决问题,他们目前已经编写了成千上万的实用库,并将其发布到 Web 上. 如何共享如此多的库是一个令人头痛的问题. 

转一篇dudu大人的文章:程序员,用NuGet管理好你的包包

每个女人都有很多包包:其实男人也有,但只有会写程序的男人才有 -- 代码世界中的大"包"小"包".这些大包小包,有花钱买的,有从开源市场淘的,也有自己或同事亲手制作的. 包包有个特点:容易坏,更新快,新品多.于是,市场上有了包包专卖店,家里有了专门放包包的衣橱.于是,女人经常逛街买包包,经常整理衣橱里的包包.而男人呢,不喜欢逛街,不喜欢整理...面对越来越多的包包,很多人发出感叹:做"会写程序的男人"难! 终于有人无法忍受这些大包小包的困扰,一款

.net利用nuget管理类库包——各系统交互

高校云平台,开发过程中,每个团队开发一个子系统.每个子系统内部又分别开个各子模块. 对于整个平台来说,各自的开发不影响其他人的开发.即面向接口的编程. 那么对于各个模块来说,又是如何统一调用其他模块的接口的呢? 在开发过程中,接口的开发与使用 肯定是不定时更新的.那么整个平台就肯定使用一个工具来统一管理 各个模块的接口. 使用nuget进行管理各个模块的类库.每个发布一个自己的接口.如果调用其他的系统,则进行引用. 例如,考试系统的数据,大都来自与基础系统.所以需要引用平台下,基础系统的dll文

Nuget~管理自己的包包~丢了的包包快速恢复

之前写过一篇Nuget~管理自己的包包的文章,今天来讲Nuget的另一个东西,就是找回丢失的DLL,我们在引用包包后,在当前解决方案根目录就生成一个packages的目前,里面有我们从nuget下载的DLL组件,其实包括了微软自己的扩展组件,如MVC,Razor等等,当然我们安装的第三方组件也在其中,由于我们的包包被安装到了当前解决方案的根目录,所以,当你这个解决方案被勿删除后,对于其实解决方案就产生了影响,因为你的包包默认是在先前的解决方案目录的. 下面说一下自动快速恢复包包的方法: 1 设置

Nuget~管理自己的包包

很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈! 对于我们做软件的人来说,如何把自己写的组件,框架放在包包里进行管理,也是一门学问,原来自己的组件都是很乱了,没有版本的概念,在升级后,很多旧的项目都无法正常工作了,这对于我来说很是头疼,还好最近看到了nuget很是不错,就用了一把,现在感觉已经离不开它了,下面介绍一下生成自己包包的方法 1 下载工

以rpm为后端及以yum为前端工具的程序包管理器在Linux发行版系统centos中的使用

程序包管理: 应用程序的安装,实际上是解压缩并复制程序包中的文件到指定目录的过程: 程序包管理器: 方便终端用户进行程序的安装.卸载.升级.安装信息查询及校验等工作: 不同的Linux的发行版本中,有不同的程序包管理器: Debian:dpt:Redhat:rpm:S.u.S.E:rpm:Gentoo:借鉴了FREEBSD的portage程序包管理机制,ports方式,emerge工具:ArchLinux:pacman 以CentOS为例,rpm程序包管理器: rpm程序包的命名规则: 源代码包

Linux的发行版及其描述

Linux的十种发行版及其描述 linux其中十种发行版本为Debian.Gentoo.Ubuntu.Damn Vulnerable Linux.红帽企业级Linux. CentOS.Fedora.Kali Linux.Arch Linux.OpenSuse等. Debian Debian运行起来极其稳定,这使得它非常适合用于服务器.Debian平时维护三套正式的软件库和一套非免费软件库,这给另外几款发行版(比如Ubuntu和Kali等)带来了灵感.Debian这款操作系统派生出了多个Linux

微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容器技术的支持的版本,也提供了 Nano Server 和数据中心增强的功能. Windows Server 容器是微软和 Docker 合作的,开发者可以通过隔离操作系统环境的方式来运行应用.Windows Server 容器是 Docker 开源计划的一部分,容器可以通过 PowerShell 或

Linux基础系列之---Linux的常见发行版

Linux的常见发行版有几大分支: Linux发行版有数百种之多,我们只列举常见的几种发行版有:RedHat.Debian.Slackware.Gentoo等几大分支,除介绍的几大分支外,还有基于以上分支的二次发行版,如:基于RedHat的二次发行版CentOS.基于Debian的二次发行版Ubutu.knopix等.还有基于二次发行版再此封装发行的版本,如基于Ubutu发行的mint等. 1.RedHat分支 Redhat 9.0(个人版.9.0后交给了Fedora进行维护) RedHat E