一、基本知识

(1)NuGet :

NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件,同时也可以通过NuGet来安装一些Visual Studio的插件等。作为一名开发人员,您可能也会开发一些公共组件以供他人使用,本文将一步步介绍如何以最简单的方式将自己所开发的类库包发布到nuget上,以供更多的人使用[1]

(2)ProGet:

非常优秀的库创建服务器,用于放置packages。支持nuget命令行上传。其下载方式已经不用像站长大人[2]那么繁琐了,本身已自带推荐安装方式,一步一步去安装即可。安装完:

首次登陆的默认用户名与密码都为:Admin

二、NuGet.exe生成包包并上传至ProGet步骤[1,3]
(1) 获取APIKey

去NuGet官网上注册一个新的账号,然后在My Account页面,获取一个API Key。 别忘了这个Apikey不然以后很麻烦的[4]

作用详解:因为包包需要发布并共享,NuGet.exe专门提供了一条发布命令。在发布之前,需要在NuGet上创建一个账号,然后得到ApiKey。在库上载包包之前,该命令将验证库的API密钥。

(2) 下载NuGet.exe

NuGet.exe为NuGet专用的命令行工具,去官网下载,官网首页的下载包并一定适合你,最好在Download中选择相应版本。下载完后还必须将其放在环境变量中。方法:右键“计算机”,“属性”,“高级属性设置”,“高级”中的“环境变量" , ”Path“,”编辑“,将NuGet.exe的路径放进去。

(3) 用命令行设置ApiKey:

nuget setApiKey 你的key值,使其存储在安全的位置。

(4) 准备好自己的类库项目

程序包大多数情况下仅包含一个程序集。这里主要针对.csproj或者.vbproj文件创建程序包。

务必打开AssemblyInfo.cs文件以更新程序集的元数据。

在AssemblyInfo.cs文件中填写好相应的信息,主要注意四个(信息全填上当然更好,后面修改nuspec文件还方便点儿):

[assembly:Description("XXXX")]

[assembly:ComVisible(false)]

[assembly:Guid("XXXXXX")]

[assembly:AssemblyVersion("X.X.X.X")]

(5) 产生与修改nuspec文件

nuspec是程序包清单文件,包含与程序包有关的重要元数据,例如:Id,版本,标题,作者,licenseUrL,projectUrl,描述,版权等等,此类信息大多数来自AssemblyInfo.cs。nuspec可以通过nuget spec命令产生。在命令提示符下,进入TestForm.csproj文件所在目录,然后执行:

nuget spec    

注意:我在TestForm.csproj中添加了依赖项Castle.Core,但是清单文件不会显示这个依赖项,只有打成nupkg才会显示出来。nuspec的作用只是元数据清单显示。

(6) 修改产生的nuspec文件

用记事本打开TestForm.nuspec文件,把需要替换的信息替换掉,不需要的tag全部删掉,注意里面的$xxx$宏,这些就是引用了AssemblyInfo.cs中的设置值,在编译产生package的时候,会使用AssemblyInfo.cs中的相应值进行替换。

注意:1. <tags>标签不能为默认

                   2. <description>标签不能为默认

                   3. <releaseNotes>标签不能为默认

(7) 在TestForm.csproj路径下使用命令行nuget pack 进行打包。

基本命令:nuget pack TestForm.csproj

NuGet会使用默认的项目配置所产生的程序集进行打包。如果项目默认是Debug,而你需要用Release打包,则使用下面的命令:

Nuget pack TestForm.csproj -Prop Configuration=Release

注意:1.如果同一个目录中只有一个项目文件,则在运行命令时可以省略项目文件名称。

2.如果是尚未编译项目,可先用Build标记编译项目,然后压缩它。这将在运行pack命令之前编译项目:nuget pack TestForm.csproj -Build

Nupkg包究竟包含哪些文件:

1. libs文件,里面包含生成的dll或者exe文件

2. .rels文件

3. Content_type.xml文件

4. nuspec清单文件

5. package文件夹,主要包含core-properties

6. 其他

如果项目中含有依赖,生成的nupkg也会显示出来:

(8) 发布自己的包包到ProGet

包包打包完就可以上传至ProGet了[5]

命令行: nuget push "你的包包完整路径"  你的ApiKey -Source 你的ProGetURL -ApiKey 你的用户名:你的密码

最后浏览你的ProGet:

我们随便打开一个项目,打开NuGet安装包管理器,显示 TestForm:

(9) 更新自己的包包到ProGet

更新包包相对容易,只要你更改AssemblyInfo.cs中的信息,尤其是版本信息,然后重复(7)与(8)即可:

观察ProGet:

三、ProGet使用方法

ProGet是一个非常全面的库,该库中主要包括三项:Feed,Packages,Connector。

Feed用于建立仓库,能建立Universal(通用库)、NuGet库、Chocolatey、Maven、npm、Bower六种库。

1. 建立Feed时首先选择库的类型,然后命名Feed名称,然后出现配置画面,如果设置好其中的NuGet ApiKey,以后nuget push 时就不用最后加一句-APIKey Username:Password了。

DropPath应该是个缓存路径,其原文翻译:每次会扫描该路径下的包包用以Import,如果Import成功,则会删除该路径下的所有包包。

建立完Feed时记住它的Package Source URL:

2. 建立Packages

建立完Feed就可以上传你的packages了:

        3. Connectors

Connector的作用是再连接一个包源,比如你当前的包源为A,你可以再设置一个Connector指向包源B,这样在NuGet服务器上浏览你的包源A会发现包源B的资源也在。

4. 使用NuGet安装包管理器下载包包

包包上传完之后,我们需要连接到该ProGet库用以共享包包,在NuGet包管理器—>程序包管理器设置—>添加一个库,就是点“+”,输入名称和源即可,点击确定即可。

5. 使用包包:

NuGet包管理器—>管理解决方案的NuGet程序包—>联机,找到你定义的名称即可:

四、融入Jenkins(python脚本) 

流程图:

       python脚本代码:

# coding=gbk
import os
import sys
import re def getdisc(projectpath): #获得项目文件的当前盘
disc = projectpath.split(':',)[]
disc = disc+":"
return disc def getAssemblyVersion(projectpath): #根据Assembly获取版本号
assemblyInfoFile = projectpath+"/Properties/AssemblyInfo.cs"
lines= open(assemblyInfoFile,'r+',encoding='iso-8859-15').readlines()
flen=len(lines)-
for i in range(flen):
if lines[i].startswith("[assembly: AssemblyVersion"):
versioncode = lines[i].split('"',)[]
break
return versioncode def modifynuspec(projectfilepath,projectname): #修改nuspec文件内容
li = os.listdir(projectfilepath)
for filename in li:
if filename.endswith(".nuspec"):
nuspecfile = filename.replace(".nuspec",".xml") #nuspec->xml
nuspecfile = projectfilepath+"/"+nuspecfile
filename = projectfilepath+"/"+filename
os.rename(filename,nuspecfile)
break
count=
for filecsproj in li:
if filecsproj.endswith(".csproj"):
count+=
if count==:
tfile = projectfilepath+"/"+projectname+".xml"
else:
tfile = projectfilepath+"/"+"Package.xml" f = open(tfile,'r')
xmldata = f.read()
xmldata = re.sub('\<description>(.*?)\</description>','<description>'+projectname+'</description>',xmldata)
xmldata = re.sub('\<tags>(.*?)\</tags>','',xmldata)
xmldata = re.sub('\<releaseNotes>(.*?)\</releaseNotes>','',xmldata)
f.close()
f = open(tfile,'w')
f.write(xmldata)
f.close() li = os.listdir(projectfilepath)
for filename in li:
if filename.endswith("Package.xml") or filename.endswith(''+projectname+'.xml'):
nuspecfile = filename.replace(".xml",".nuspec") #xml->nuspec
nuspecfile = projectfilepath+"/"+nuspecfile
filename = projectfilepath+"/"+filename
os.rename(filename,nuspecfile)
break
return if __name__ == '__main__':
if len(sys.argv)!=:
sys.exit(-)
NuGetpath = sys.argv[]
Projectfilepath = sys.argv[]
Projectname = sys.argv[]
ProGetSourceUrl = sys.argv[]
ProGetAdmin =sys.argv[]
ProGetPassword =sys.argv[]
myApikey =sys.argv[]
NuGetdisc = getdisc(NuGetpath)
ProjectDisc = getdisc(Projectfilepath)
Projectnuspec =Projectfilepath+"/"+Projectname+".nuspec"
if not os.path.exists(Projectnuspec):
os.system(''+NuGetdisc+'&&cd '+NuGetpath+'&&nuget setApiKey '+myApikey+'')
os.system(''+ProjectDisc+'&&cd '+Projectfilepath+'&&nuget spec')
modifynuspec(Projectfilepath,Projectname)
Projectnamecsproj = Projectname+".csproj"
os.system(''+ProjectDisc+'&&cd '+Projectfilepath+'&&nuget pack '+Projectnamecsproj+'')
ConvertProjectfilepath = Projectfilepath.replace("/","\\")
Nupkgpath = ConvertProjectfilepath+"\\"+Projectname+"."+getAssemblyVersion(Projectfilepath)+".nupkg"
os.system(''+NuGetdisc+'&&cd '+NuGetpath+'&&nuget push '+Nupkgpath+' '+myApikey+' -Source '+ProGetSourceUrl+' -ApiKey '+ProGetAdmin+':'+ProGetPassword+'')

注意:如果项目路径下有多个.csproj文件,那么进行nuget spec操作会产生一个名为Package.nuspec的nuspec文件,而不是<项目名.nuspec>文件,千万注意这点。

后记:

刚参加工作一月多,之前一直都是写的C#代码。组长让我写脚本去完成公司内项目文件的打包工作,一开始什么都不知道,虽然平时用P4V和Git,可是发现自己并不了解分布式控制的内涵,经过一星期组长对我的洗脑,摆正了许多错误的概念。那个星期我觉得我就是个智障,什么都听不懂,有时候好像懂了,可是和组长讨论后又发现是错了。还好,现在总算是明白了。根据组长对我的教育,我画了个流程图并自己开始写代码。

这篇博文的前部分参考了Reference的前三篇文章,他们的文章对我有很多的帮助,在他们的基础上我进一步详细说明了下。希望这篇博文对大家有帮助,欢迎留言讨论。最后,感谢已经被我整奔溃的组长。

References:

[1] http://www.cnblogs.com/daxnet/archive/2013/05/07/3064577.html

[2] http://www.cnblogs.com/dudu/p/5147284.html

[3] http://blog.csdn.net/dandanzmc/article/details/42012429#comments

[4] https://www.nuget.org/

[5] http://inedo.com/proget

作者:airforce094

出处:http://www.cnblogs.com/lovecsharp094/p/5527204.html

转载请注明原文出处 , 谢谢合作

【NuGet】使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】的更多相关文章

  1. 使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】

    一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...

  2. 使用NuGet打包并发布至ProGet过程 (打包再次详解)【下篇】

    一.前言 上篇[1]主要介绍了利用csproj文件使用NuGet打包至ProGet的过程,并附上了用于在Jenkins上运行的python脚本.本篇的主要内容分为以下几点: 1. Nuspec与Nup ...

  3. 【NuGet】使用NuGet打包并发布至ProGet过程 (打包再次详解)【下篇】

    一.前言 上篇[1]主要介绍了利用csproj文件使用NuGet打包至ProGet的过程,并附上了用于在Jenkins上运行的python脚本.本篇的主要内容分为以下几点: 1. Nuspec与Nup ...

  4. 使用 dotnet CLI 来打包和发布 .NET Core nuget package

    原文链接:使用 dotnet CLI 来打包和发布 .NET Core nuget package 如何使用 visual studio 2015/2017 打包和发布 Nuget package, ...

  5. 流程自动化RPA,Power Automate Desktop系列 - DotNet Core打包并发布Nuget Package

    一.背景 DotNet Core通常基于Nuget来实现包管理,如果你想要把自己的实现共享给其他人,通常我们需要把本地项目打包好,然后发布到对应的Nuget Server上,以便于其他人可以查找.安装 ...

  6. 打包dll发布到nuget服务器

    几个月前上传过一次nuget包,结果好久不用,今天想更新下,完全忘记了怎么用了,又是一顿查,所以决定记录下来,当然这可能不是一个傻瓜式的教程,但聪明的你们应该能够看明白的,因为整体操作还是很简单的 好 ...

  7. NET Core:搭建私有Nuget服务器以及打包发布Nuget包

    docker 安装 https://www.cnblogs.com/liuxiaoji/p/11014329.html 1.使用docker搭建私有Nuget服务器 docker run -d -p ...

  8. 自己编辑Nuget拓展包,并发布Nuget服务器,提供下载使用

    1. 在NuGet官网上注册并获取API Key 到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,如果没有则在API keys 页面创建一个就可以. 2. 下载 ...

  9. Nuget 通过 dotnet 命令行发布

    在开发完成一个好用的轮子就想将这个轮子发布到 nuget 让其他小伙伴可以来使用,但是 nuget.org 的登陆速度太慢,本文介绍一个命令行发布的方法,通过命令行发布的方法可以配合 Jenkins ...

随机推荐

  1. javaweb总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  2. PHP双向队列

    假定队列的左边为头部,右边为尾部 <?php class myDeque { private $deque=array(); /** *头部进队列 */ public function lPus ...

  3. docker应用容器化准则—12 factor

    在云的时代,越来越多的传统应用需要迁移到云环境下,新应用也要求能适应云的架构设计和开发模式.而12-factor提供了一套标准的云原生应用开发的最佳原则. 在容器云项目中应用容器化主要参考12-Fac ...

  4. C语言--指针详解

    这段时间在看 Linux 内核,深觉 C 语言功底不扎实,很多代码都看不太懂,深入学习巩固 C 语言的知识很有必要.先从指针开始. 一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字 ...

  5. 数据时代的的企业管理 记SAP商业同略会

    [PConline 资讯]在2012 SAP中国商业同略会城市论坛深圳站上,自SAP中国的萧洁云总裁和张志琦先生,对SAP中国的战略.SAP的技术战略,以及SAP对于行业趋势分析与媒体进行了沟通,对数 ...

  6. git blame 查看某行代码提交记录

    1. 在当前git项目目录下执行 git blame -L 38,38 <filename> 例子:  git blame -L 38,38 src/component/BarCode/i ...

  7. apply新用法,最大值查找

    要找到数组中的最大或最小值,可以像下面这样使用apply() var values=[1,2,3,4,5,6,7,8]; var max = Math.max.apply(Math,values); ...

  8. UI分析之石家庄铁道大学官网

    点击进入石家庄铁道大学的官方网站,首先映入眼帘的是“石家庄铁道大学”七个大字,配以蓝色背景和学校的俯瞰图,给人一种严谨又不失清新的感觉. 学校的网站首页界面主要有九个界面,分别是网站首页,学校概况,组 ...

  9. 2018软工实践—Alpha冲刺(4)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  10. Throwable、Error、Exception、RuntimeException 区别 联系

    1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获 ...