源文章:dax.nethtml
http://www.cnblogs.com/daxnet/archive/2013/05/07/3064577.htmlgit
NuGet是一个为你们所熟知的Visual Studio扩展,经过这个扩展,开发人员能够很是方便地在Visual Studio中安装或更新项目中所须要的第三方组件,同时也能够经过NuGet来安装一些Visual Studio的插件等。做为一名开发人员,您可能也会开发一些公共组件以供他人使用,本文将一步步介绍如何以最简单的方式将本身所开发的类库包发布到nuget上,以供更多的人使用。shell
若是你仍是不知道什么是NuGet,那么就看这样一个案例:我如今须要在个人项目中引用Castle.Core程序集,按照以往的作法,就是从Castle Projects官方网站,下载一个最新版本的dll,而后把它复制到项目的lib目录下(或者随便什么地方都行),这样作不只繁琐,并且你须要时刻关心官网上这个程序集的最新版本信息(固然或许你也不会去关注),更烦的是,若是你是一个开源项目的Contributor,你还须要花必定的时间去管理全部的这些libs,不只如此,若是你是使用的源代码管理系统来管理项目源码,好比使用git等,那你还不得不把这些libs上传到源代码管理系统中,不然团队中的其余组员即便得到了源代码,也没法正确编译。但这样作又大大增长了源代码的存储空间,使得代码克隆和下载都变得很是耗时。apache
如今,就能够直接使用NuGet来解决全部问题,咱们先建立一个Class Library,命名为DaxnetNugetTest,而后在这个项目上点右键,选择Manage NuGet Packages:api
在弹出的对话框中,搜索Castle关键字,而后在搜索结果列表中选择Castle.Core,单击Install按钮:服务器
安装完成后,Castle.Core的程序集就被引用到项目中了,同时在项目中多出了一个packages.config文件,以向NuGet代表,当前项目使用了哪些Package,版本是什么,以及是基于哪一个版本的.NET Framework。工具
从此,若是Castle.Core程序集有版本更新,则一样可使用Manage NuGet Packages菜单打开上面的对话框,而后在左边的Updates列表中,就会列出发生了版本更新的Package,若是有,则单击Update按钮便可更新。post
更有趣的是,若是你在解决方案上点右键,选择Enable NuGet Package Restore菜单,那么在你编译项目的时候,NuGet会自动分析出你项目所依赖的第三方组件,而后在编译开始以前会自动上网下载所需的版本,所以,你也就不要去维护这些libs了,更不必把这些libs也上传到源代码管理系统中。学习
不过这些也都不是本文的重点,本文的重点是,介绍如何将本身的Class Library发布到NuGet上。测试
首先,你须要到NuGet上注册一个新的帐号,而后在My Account页面,获取一个API Key,这个过程很简单,我就不做说明了。
NuGet有个命令行工具:NuGet.exe,很是好用,不过使用以前须要下载,下载地址:http://nuget.codeplex.com/downloads/get/669083。为了方便使用,请设置机器的PATH环境变量,将NuGet.exe的路径添加到PATH中。
使用如下命令设置NuGet API Key:
1
|
nuget setApiKey <my_api_key>
|
记得将上面的my_api_key替换为STEP 1中得到的API Key。
上面咱们新建了一个类库:DaxnetNugetTest,并经过NuGet添加了对Castle.Core的引用,如今咱们添加一些代码,来使用Castle.Core所提供的一些功能。咱们将Class1.cs更名为CastleHelper.cs,此时也会将Class1类更名为CastleHelper。在CastleHelper.cs中写入如下代码:
1
2
3
4
5
6
7
|
public
class
CastleHelper
{
public
static
Castle.Core.Pair<
int
,
int
> GetIntPair()
{
return
new
Castle.Core.Pair<
int
,
int
>(20, 30);
}
}
|
而后,打开AssemblyInfo.cs文件,将assembly的属性设置好,记得再设置一下AssemblyVersion特性,以指定咱们类库的版本。目前咱们使用1.0.0.0版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[assembly: AssemblyTitle(
"DaxnetNugetTest"
)]
[assembly: AssemblyDescription(
"Daxnet's test of the NuGet."
)]
[assembly: AssemblyConfiguration(
""
)]
[assembly: AssemblyCompany(
"daxnet"
)]
[assembly: AssemblyProduct(
"DaxnetNugetTest"
)]
[assembly: AssemblyCopyright(
"Copyright © daxnet 2013"
)]
[assembly: AssemblyTrademark(
""
)]
[assembly: AssemblyCulture(
""
)]
[assembly: ComVisible(
false
)]
[assembly: Guid(
"20662b9f-91de-4515-9c8c-ced3d61589e1"
)]
[assembly: AssemblyVersion(
"1.0.0.0"
)]
|
所有设置好之后,编译整个项目待用。
nuspec是NuGet将项目打包成nupkg的输入文件,能够经过nuget spec命令产生。在命令提示符下,进入DaxnetNugetTest.csproj文件所在目录,而后执行:
1
|
nuget spec
|
此时会提示建立成功:
用notepad打开DaxnetNugetTest.nuspec文件,把须要替换的信息替换掉,不须要的tag所有删掉,注意里面的$xxx$宏,这些就是引用了AssemblyInfo.cs中的设置值,在编译产生package的时候,会使用AssemblyInfo.cs中的相应值进行替换。完成编辑后,咱们的nuspec文件以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
xml
version="1.0"?>
<
package
>
<
metadata
>
<
id
>$id$</
id
>
<
version
>$version$</
version
>
<
title
>$title$</
title
>
<
authors
>$author$</
authors
>
<
owners
>$author$</
owners
>
<
licenseUrl
>http://www.apache.org/licenses/LICENSE-2.0.html</
licenseUrl
>
<
projectUrl
>http://apworks.org</
projectUrl
>
<
requireLicenseAcceptance
>false</
requireLicenseAcceptance
>
<
description
>$description$</
description
>
<
releaseNotes
>First release</
releaseNotes
>
<
copyright
>Copyright 2013</
copyright
>
</
metadata
>
</
package
>
|
注意两点:一、$description$使用AssemblyDescriptionAttribute的值进行替换,在产生package以前,必定要记得先编译项目,不然会提示$description$找不到的错误;二、releaseNotes若是没有,就直接删掉这个节点,若是有,则填入本身的内容,不要使用默认内容,不然会在下一步产生警告信息。
一样在DaxnetNugetTest.csproj路径下,使用下面的命令产生NuGet类库包:
1
|
nuget pack DaxnetNugetTest.csproj
|
成功后,提示:
注意:因为咱们的项目经过NuGet引用了Castle.Core,所以,它将会做为一个依赖组件(dependency)打包到产生的nupkg文件中。
另外,NuGet会使用默认的项目配置所产生的程序集进行打包。若是项目默认是Debug,而你须要用Release打包,则使用下面的命令:
1
|
nuget pack DaxnetNugetTest.csproj -Prop Configuration=Release
|
如今,经过如下命令发布类库包:
1
|
nuget push DaxnetNugetTest.1.0.0.0.nupkg
|
完成之后,出现如下提示:
新建一个控制台应用程序,在项目上点右键,选择Manage NuGet Packages,在搜索框中输入DaxnetNugetTest,此时咱们发布的Package已经能够显示了:
单击Install按钮,NuGet会自动分析组件依赖关系,而后把所须要的全部程序集都下载下来并添加到项目引用中:
写一点代码来测试:
1
2
3
4
5
6
7
8
9
|
class
Program
{
static
void
Main(
string
[] args)
{
var
pair = DaxnetNugetTest.CastleHelper.GetIntPair();
Console.WriteLine(pair.First);
Console.WriteLine(pair.Second);
}
}
|
输出以下:
随着类库开发进度不断向前,必然会有版本更新。更新类库包很简单,只须要在AssemblyInfo.cs中更新一下版本号,而后从新执行上面的STEP 六、7便可。注意在执行STEP 7的时候,nupkg的文件名应该使用新版本的文件名。
如今,咱们从新打开DaxnetNugetTest项目,将CastleHelper类中的20,30改成40,50,而后打开AssemblyInfo.cs,版本号升级为2.0.0.0,从新编译项目,并从新产生、发布nupkg:
再打开用来测试的控制台程序,一样打开Manage NuGet Packages对话框,咱们能够在Updates中看到,DaxnetNugetTest有了更新:
点击Update按钮,将类库更新到最新版本。从新运行这个控制台程序,咱们发现,输出已是最新版本的值了:
原则上,NuGet不容许用户删除已发布的包,而只能将其设置为不显示在Manage NuGet Packages的列表中。打开www.nuget.org,用已注册的帐户登陆后,能够在My Account页面选择Manage My Packages连接进入管理页面:
进入后,能够看到咱们已发布的Packages:
点击DaxnetNugetTest左边的小垃圾桶图标,便可进入Listing页面,页面中咱们也能看到“Permanently deleting packages is not supported”的提示。要将Package从Package List中移除,只须要去掉List DaxnetNugetTest 2.0.0.0 in search results选项前面的钩钩,而后单击Save按钮保存便可:
本文简要介绍了NuGet的使用,并介绍了一种将本身开发的类库以NuGet Package的方式发布到NuGet服务器的简单方法。NuGet功能很是强大,有兴趣的朋友能够上www.nuget.org进行学习研究。