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 管理我们的程序集 - 预发行版的更多相关文章

  1. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  2. .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件

    系列目录     [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...

  3. linux 各种发行版及包管理器的关系

    linux 各种发行版及包管理器的关系 Linux发行版列表 基于Kpkg(Debian 系) Debian GNU / Linux 及其派生发行版使用deb软件包格式,并使用dpkg及其前端作为包管 ...

  4. Nuget 命令 NuGet 管理项目库

    因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在"程序包管理器控制台"中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项目的目标 ...

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

    原文地址:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 ...

  6. 使用 NuGet 管理项目库

    使用 NuGet 管理项目库 Phil Haack 本文转载自:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Micros ...

  7. [转载]使用 NuGet 管理项目库

    原文:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Mi ...

  8. 【VS开发】使用 NuGet 管理项目库

    NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Microsoft 在全球的员工人数接近 90,000, ...

  9. 使用NuGet管理项目类库引用

    NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2012 ,VS2013中默认集成了N ...

随机推荐

  1. Python内置模块与标准库

    Python内置模块就是标准库(模块)吗?或者说Python的自带string模块是内置模块吗? 答案是:string不是内置模块,它是标准库.也就是说Python内置模块和标准库并不是同一种东西. ...

  2. spring-boot-mybatis-多数据源

    sql 语句 DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT ...

  3. C++产生固定范围内的固定数量的随机数

    #include<iostream> #include<ctime> #include<random> using namespace std; void knut ...

  4. apropos找命令助手

    apropos (意即"关于")能够搜索 Linux 帮助文档来帮你找到你想要的命令.比如说,你不记得你用的发行版用的什么防火墙工具了.你可以输入 apropos "fi ...

  5. 使用SpringCloud搭建高可用服务注册中心

    我们需要的,不仅仅是一个服务注册中心而已,而是一个高可用服务注册中心. 上篇博客中我们介绍了如何使用Spring Cloud搭建一个服务注册中心,但是搭建好的服务注册中心是一个单节点的服务注册中心,这 ...

  6. Linux删除以减号开头的文件

    2014年5月5日 10:33:47 原因:文件乱码了,乱码后以减号开头,删不掉 摘抄: 文件系统出现一个文件 -C.html 如何删除/新建?rm -- "-C.html" to ...

  7. spring-dao.xml 模板

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. 文件时间戳修改touch和查看stat和ls --time

    查看文件时间戳命令:stat awk.txtFile: `awk.txt'Size: 20  Blocks: 8  IO Block: 4096  regular fileDevice: 801h/2 ...

  9. mapreduce的组件介绍

    第一部分:重要的组件 Combiner •什么是Combiner •combine函数把一个map函数产生的<key,value>对(多个key, value)合并成一个新的<key ...

  10. py-faster-rcnn在windows下安装

    准备好vs2013+anaconda2+好点的显卡(比如GTX970) 先改造caffe-rfcn以支持cudnn5,得到caffe-rfcn-cudnn5:替换个别代码文件和代码:改.props 再 ...