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. 20155303 实验四 Android程序设计

    20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

  2. centos6.5环境DNS-本地DNS服务器bind的搭建

    centos6.5环境DNS-本地DNS服务器bind的搭建 域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库, ...

  3. jstack查看Java堆栈信息

    命令 jps 查看进程id jstack 1234 查看该进程的线程堆栈信息 对于每个线程,都有如下信息: 线程名,如“main”线程属性(如果是Daemon线程,会有Daemon标识,否则,什么都没 ...

  4. 利用CSS改变输入框的光标颜色

    转:http://www.cnblogs.com/gymmer/p/6810367.html 代码: <!DOCTYPE html> <html lang="en" ...

  5. UFLDL 教程学习笔记(一)

    ufdl的新教程,从基础学起.第一节讲的是线性回归.主要目的是熟悉目标函数,计算梯度和优化. 按着教程写完代码后,总是编译出错,一查是mex的原因,实在不想整了. 这位博主用的是向量,比较简洁:htt ...

  6. 如何批量删除word文档中的超级链接?

    有时候从网页上copy来的文章中,会带有非常多的链接,这些链接很烦人是吧?如何批量删除(一次性全部删除)word文章中的超链接呢? 有些朋友说,Ctrl+A全选文章,然后点击格式工具栏上的“清除格式” ...

  7. mavean导入本地仓库

    当你刚开始用mavean的时候可能还没有发现mavean导入本地仓库方法的重要性,但是随着经常使用mavean项目就会发现,有些jar包mavean从网上的mavean仓库中无法导入,例如oracle ...

  8. 025 Spark中的广播变量原理以及测试(共享变量是spark中第二个抽象)

    一:来源 1.说明 为啥要有这个广播变量呢. 一些常亮在Driver中定义,然后Task在Executor上执行. 如果,有多个任务在执行,每个任务需要,就会造成浪费. 二:共享变量的官网 1.官网 ...

  9. java go

    熟练掌握java技术,对多线程.数据结构有清晰的认识: 熟悉MySQL/Oracle数据库,熟悉关系数据库应用设计开发: 熟悉Spring/MyBatis/Freemarker等一种或者多种框架: j ...

  10. yield, async

    yield实现斐波那契序列: import sys, time def fib(): a,b,c = 0,1,0 while True: yield c a,b = b, c c = a + b if ...