如何用jenkins自动生成nuget包

如何用jenkins自动生成nuget包,第1张

关于NuGet的介绍已经很多,可以参考下面的:

NuGet学习笔记(1)——初识NuGet及快速安装使用 http://kb.cnblogs.com/page/143190/

NuGet学习笔记(2)——使用图形化界面打包自己的类库 http://kb.cnblogs.com/page/143191/

NuGet学习笔记(3)——搭建属于自己的NuGet服务器 http://kb.cnblogs.com/page/143192/

上面的文章介绍了搭建Web版本的NuGet服务器以及用图形化的方式生成NuGet包。

用NuGet.Server管好自家的包包 http://www.cnblogs.com/dudu/archive/2012/06/05/nuget_server_push.html

上面的文章介绍了搭建Web版本的NuGet服务器,以及自动化生成NuGet包的方法

本文介绍简单的NuGet服务器,以及VS2013自动化生成NuGet包的内容。

一、VS自动生成NuGet包

1、在VS中创建类库项目

2、启用NuGet程序包还原(Enable

NuGet Package Restore)

在解决方案上右击,选择“启用NuGet程序包还原”

确定后会在解决方案中增加一个“.nuget"文件夹,该文件夹有三个文件。

此时,打开项目文件ClassLibrary1.csproj,可以看到类似下面的内容,注意:下面绿色背景行的内容是否出现在ClassLibrary1.csproj中

<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists(‘$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props‘)" />

<PropertyGroup>

<Configuration Condition=" ‘$(Configuration)‘ == ‘‘ ">Debug</Configuration>

<Platform Condition=" ‘$(Platform)‘ == ‘‘ ">AnyCPU</Platform>

<ProjectGuid>{92A6F604-9829-49FB-8B06-FF2E4C757EC4}</ProjectGuid>

<OutputType>Library</OutputType>

<AppDesignerFolder>Properties</AppDesignerFolder>

<RootNamespace>ClassLibrary1</RootNamespace>

<AssemblyName>ClassLibrary1</AssemblyName>

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

<FileAlignment>512</FileAlignment>

<SolutionDir Condition="$(SolutionDir) == ‘‘ Or $(SolutionDir) == ‘*Undefined*‘">..\</SolutionDir>

<RestorePackages>true</RestorePackages>

</PropertyGroup>

<PropertyGroup Condition=" ‘$(Configuration)|$(Platform)‘ == ‘Debug|AnyCPU‘ ">

<DebugSymbols>true</DebugSymbols>

<DebugType>full</DebugType>

<Optimize>false</Optimize>

<OutputPath>bin\Debug\</OutputPath>

<DefineConstants>DEBUGTRACE</DefineConstants>

<ErrorReport>prompt</ErrorReport>

<WarningLevel>4</WarningLevel>

</PropertyGroup>

<PropertyGroup Condition=" ‘$(Configuration)|$(Platform)‘ == ‘Release|AnyCPU‘ ">

<DebugType>pdbonly</DebugType>

<Optimize>true</Optimize>

<OutputPath>bin\Release\</OutputPath>

<DefineConstants>TRACE</DefineConstants>

<ErrorReport>prompt</ErrorReport>

<WarningLevel>4</WarningLevel>

</PropertyGroup>

<ItemGroup>

<Reference Include="System" />

<Reference Include="System.Core" />

<Reference Include="System.Xml.Linq" />

<Reference Include="System.Data.DataSetExtensions" />

<Reference Include="Microsoft.CSharp" />

<Reference Include="System.Data" />

<Reference Include="System.Xml" />

</ItemGroup>

<ItemGroup>

<Compile Include="Class1.cs" />

<Compile Include="Properties\AssemblyInfo.cs" />

</ItemGroup>

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists(‘$(SolutionDir)\.nuget\NuGet.targets‘)" />

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

<PropertyGroup>

<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>

</PropertyGroup>

<Error Condition="!Exists(‘$(SolutionDir)\.nuget\NuGet.targets‘)" Text="$([System.String]::Format(‘$(ErrorText)‘, ‘$(SolutionDir)\.nuget\NuGet.targets‘))" />

</Target>

<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

Other similar extension points exist, see Microsoft.Common.targets.

<Target Name="BeforeBuild">

</Target>

<Target Name="AfterBuild">

</Target>

-->

</Project>

如果没有出现带加号行的内容,需要手动添加上。

第2块绿背景内的代码创建了对.nuget文件夹下的NuGet.targets文件的引用,并添加了缺少NuGet.targets文件的错误信息。

第1块绿背景内的第1行代码创建了SolutionDir 并设置默认值为项目的父目录,NuGet.targets利用这个配置值来找到他需要的NuGet.exe等资源。

第二行代码,RestorePackages被设置为True。

3、设置BuildPackages

2中启用了NuGet还原,但是还需要设置让NuGet自动生成nupkg包文件,用记事本打开.csproj文件添加下面1行语句

<BuildPackage>true</BuildPackage>

到1下一行的话,Debug和Release编译均生成包

到2下一行的话,只用Debug编译才生成包

到3下一行的话,只用Release编译才生成包

4、编译

编译后就可以再bin文件夹下看到.nupkg文件了

1.

首先下载 包包管理器 NuGetPackageExplorer,顾名思义,包包管理器可以用来创建新的类库包,也可以浏览已经创建好的类库包

2.

下载完成后,双击 NuGetPackageExplorer.application 进行安装,安装完成后会在桌面上生成一个NuGet Package

Explorer 的快捷方式

 3.

双击NuGet Package Explorer出现启动界面,选择Create a new package(Ctrl+N)创建一个新包

4.

选择菜单 Edit >Edit

Package Metadata (或者 CTRL + K) 编辑包包信息

这里可以编辑类库包的信息和添加类库、程序集的引用解释下几个比较重要的字段

Id:用于定位类库包的唯一标示,如在命令行下执行

Install-Package MyPackage 这里的MyPackage就是包包的Id值

Version:类库的版本号,这里建议和程序集的真实版本号保持一致,以免发生混淆

Dependencies:此类库依赖的程序集,根据实际情况添加依赖类库的Id和版本号,若无留空即可,这里需要注意下填写的依赖类库需要在NuGet服务器上能找到,否则无法完成自动引用添加

Framework

assemblies:依赖的Framework 程序集,根据实际需要选择即可,一般无需设置

除以上四项以外其他属性根据实际情况修改即可,若自己用不修改也中,不过为了使用方便还是建议把类库描述(Description)填写下

5.

编辑好包包信息后接下来添加DLL到包包中

可以选择

右键-->Add Existinng File... 选择dll添加,也可以直接拖拽DLL到 Package contents

窗口,此例选择拖拽方式

直接拖拽dll到窗口后,会出现提示:是否将 Winista.HtmlParser.dll放到lib

文件夹下,一般我们选择是

6.

DLL添加完成后,快捷键Ctrl + K 修改包包信息Id为Winista.HtmlParser,版本号为1.8.0

7.

信息修改和dll都添加完毕后,选择File -->Save(或Ctrl + S)将文件进行保存,默认文件名为Id + 版本号.nupkg

8.

完成保存后如需要发布到网上,选择File-->Publish...(或Ctrl + P)

默认的发布地址是官网,发布

Key需要到官网去注册一个账号,然后就可以得到,这里不在复述,若无需发布直接关闭即可

使用NuGet发布自己的类库包(Library Package)

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

背景

如果你还是不知道什么是NuGet,那么就看这样一个案例:我现在需要在我的项目中引用Castle.Core程序集,按照以往的做法,就是从Castle Projects官方网站,下载一个最新版本的dll,然后把它复制到项目的lib目录下(或者随便什么地方都行),这样做不仅繁琐,而且你需要时刻关心官网上这个程序集的最新版本信息(当然或许你也不会去关注),更烦的是,如果你是一个开源项目的Contributor,你还需要花一定的时间去管理所有的这些libs,不仅如此,如果你是使用的源代码管理系统来管理项目源码,比如使用git等,那你还不得不把这些libs上传到源代码管理系统中,否则团队中的其他组员即使获得了源代码,也无法正确编译。但这样做又大大增加了源代码的存储空间,使得代码克隆和下载都变得非常耗时。

现在,就可以直接使用NuGet来解决所有问题,我们先创建一个Class Library,命名为DaxnetNugetTest,然后在这个项目上点右键,选择Manage NuGet Packages:

在弹出的对话框中,搜索Castle关键字,然后在搜索结果列表中选择Castle.Core,单击Install按钮:

安装完成后,Castle.Core的程序集就被引用到项目中了,同时在项目中多出了一个packages.config文件,以向NuGet表明,当前项目使用了哪些Package,版本是什么,以及是基于哪个版本的.NET Framework。

今后,如果Castle.Core程序集有版本更新,则同样可以使用Manage NuGet Packages菜单打开上面的对话框,然后在左边的Updates列表中,就会列出发生了版本更新的Package,如果有,则单击Update按钮即可更新。

更有趣的是,如果你在解决方案上点右键,选择Enable NuGet Package Restore菜单,那么在你编译项目的时候,NuGet会自动分析出你项目所依赖的第三方组件,然后在编译开始之前会自动上网下载所需的版本,因此,你也就不要去维护这些libs了,更没必要把这些libs也上传到源代码管理系统中。

不过这些也都不是本文的重点,本文的重点是,介绍如何将自己的Class Library发布到NuGet上。

发布自己的类库包(Library Package)

STEP 1:在NuGet上注册并获取API Key

首先,你需要到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,这个过程很简单,我就不作说明了。

STEP 2:下载NuGet.exe

NuGet有个命令行工具:NuGet.exe,非常好用,不过使用之前需要下载,下载地址:http://nuget.codeplex.com/downloads/get/669083。为了方便使用,请设置机器的PATH环境变量,将NuGet.exe的路径添加到PATH中。

STEP 3:设置API Key

使用以下命令设置NuGet API Key:

1

nuget setApiKey <my_api_key>

记得将上面的my_api_key替换为STEP 1中获得的API Key。

STEP 4:开发自己的类库(Class Library)

上面我们新建了一个类库: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")]

全部设置好以后,编译整个项目待用。

STEP 5:产生并修改nuspec

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>

注意两点:1、$description$使用AssemblyDescriptionAttribute的值进行替换,在产生package之前,一定要记得先编译项目,否则会提示$description$找不到的错误;2、releaseNotes如果没有,就直接删掉这个节点,如果有,则填入自己的内容,不要使用默认内容,否则会在下一步产生警告信息。

STEP 6:产生类库包(Library Package)

同样在DaxnetNugetTest.csproj路径下,使用下面的命令产生NuGet类库包:

1

nuget pack DaxnetNugetTest.csproj

成功后,提示:

注意:由于我们的项目通过NuGet引用了Castle.Core,因此,它将会作为一个依赖组件(dependency)打包到产生的nupkg文件中。

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

1

nuget pack DaxnetNugetTest.csproj -Prop Configuration=Release

STEP 7:发布类库包

现在,通过以下命令发布类库包:

1

nuget push DaxnetNugetTest.1.0.0.0.nupkg

完成以后,出现以下提示:

STEP 8:测试已发布的类库包

新建一个控制台应用程序,在项目上点右键,选择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)

}

}

输出如下:

STEP 9:更新类库包

随着类库开发进度不断向前,必然会有版本更新。更新类库包很简单,只需要在AssemblyInfo.cs中更新一下版本号,然后重新执行上面的STEP 6、7即可。注意在执行STEP 7的时候,nupkg的文件名应该使用新版本的文件名。

现在,我们重新打开DaxnetNugetTest项目,将CastleHelper类中的20,30改为40,50,然后打开AssemblyInfo.cs,版本号升级为2.0.0.0,重新编译项目,并重新产生、发布nupkg:

再打开用来测试的控制台程序,同样打开Manage NuGet Packages对话框,我们可以在Updates中看到,DaxnetNugetTest有了更新:

点击Update按钮,将类库更新到最新版本。重新运行这个控制台程序,我们发现,输出已经是最新版本的值了:

STEP 10:删除已发布的包

原则上,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进行学习研究。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/358200.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存