.NET Core 系列5 :使用 Nuget打包类库

NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统统交给NuGet,添加组件/删除组件/以及更新组件即可一键完成,大大提升工作效率,减少不必要的引用报错。从运维角度,可在不影响老版本的情况下发布新版本,可统一管理公司各个项目中组件版本不一和各个版本组件的使用情况,减少故障发生以并使得项目稳定运行。

以往做nuget包我们一般要么用命令行,要么用nuget的图形化界面去做,但是一些操作比较麻烦.比如引入命名空间,引入第三方nuget包。这些在.NET Core项目里却很简单,只需要使用命令行dotnet pack,在.NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门 做了简要介绍,下面我们来详细介绍下这个命令。

dotnet-pack - 将代码打包成 NuGet 包

概要

dotnet pack [--output] [--no-build] [--build-base-path] [--configuration] [--version-suffix] [<project>]

描述

dotnet pack 命令生成项目并创建 NuGet 包。这个操作的结果是两个 nupkg 扩展名的包。一个包含代码,另一个包含调试符号。

该项目被依赖的 NuGet 包装被添加到 nuspec 文件,因此,他们能够在安装包时得到解决。 默认情况下,项目到项目之间的引用是不打包到项目中的。如果你想那样做,你需要在你的依赖中引用需要项目的 type 节点设置为 “build” ,设置就像下面的例子:

{
    "version": "1.0.0-*",
    "dependencies": {
        "ProjectA": {
            "target": "project",
            "type": "build"
        }
    }
}

默认情况下,dotnet pack 首先生成项目。如果你想避免这样,传递 --no-build 选项。这在持续集成(CI)构建场景,正如你所知道代码仅仅是预生成的示例,是很有用的。

选项

[project]

打包的项目。它还可以是一个 project.json 文件的路径或者是目录。如果忽略,它将默认为当前目录。

-o, --output [DIR]

指定生成的目录。

--no-build

打包进程中跳过生成阶段。

--build-base-path

指定临时生成产物的目录。默认情况下,它们在当前目录的 obj 目录。

-c, --configuration [Debug|Release]

当生成项目时使用的配置。如果没有指定,将默认为 “Debug”。

例子

dotnet pack

打包当前项目。

dotnet pack ~/projects/app1/project.json

打包 app1 项目。

dotnet pack --output nupkgs

打包当前的应用程序,并将生成的包放置到指定的文件夹中。

dotnet pack --no-build --output nupkgs

打包当前的项目到指定的文件夹中,并跳过生成步骤

回到我们在.NET Core系列 :3 、使用多个项目 创建的类库项目DotnetNewLib,切换到DotnetNewLib 目录下执行 dotnet pack命令:

[root@Mono DotnetNewLib]# dotnet pack Project DotnetNewLib (.NETStandard,Version=v1.6) was previously compiled. Skipping compilation. Producing nuget package "DotnetNewLib.1.0.0" for DotnetNewLib DotnetNewLib -> /root/DotnetNewLib/bin/Debug/DotnetNewLib.1.0.0.nupkg Producing nuget package "DotnetNewLib.1.0.0.symbols" for DotnetNewLib DotnetNewLib -> /root/DotnetNewLib/bin/Debug/DotnetNewLib.1.0.0.symbols.nupkg

目录结构如下:

DotnetNewLib

|-- Library.cs

|-- project.json

|-- project.lock.json

+—bin

     +—Debug

              |-- DotnetNewLib.1.0.0.nupkg

              |-- DotnetNewLib.1.0.0.symbols.nupkg

              +-- netstandard1.6

                          |-- DotnetNewLib.deps.json

                          |-- DotnetNewLib.dll

                          +-- DotnetNewLib.pdb

上面的结构里我把obj目录拿掉了,我们看到在Debug目录下生成了2个文件DotnetNewLib.1.0.0.nupkg 和DotnetNewLib.1.0.0.symbols.nupkg, 这些就是nuget 包,很简单吧,版本号信息来自于project.json文件:

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable"
  },
  "dependencies": {},
  "frameworks": {
    "netstandard1.6": {
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      }
    }
  }
}

但是我生成的是Debug,我们生成Release 版本:

dotnet pack -c Release

[root@Mono DotnetNewLib]# dotnet pack -c Release Project DotnetNewLib (.NETStandard,Version=v1.6) will be compiled because expected outputs are missing Compiling DotnetNewLib for .NETStandard,Version=v1.6

Compilation succeeded.     0 Warning(s)     0 Error(s)

Time elapsed 00:00:03.4976986

Producing nuget package "DotnetNewLib.1.0.0" for DotnetNewLib DotnetNewLib -> /root/DotnetNewLib/bin/Release/DotnetNewLib.1.0.0.nupkg Producing nuget package "DotnetNewLib.1.0.0.symbols" for DotnetNewLib DotnetNewLib -> /root/DotnetNewLib/bin/Release/DotnetNewLib.1.0.0.symbols.nupkg

生成了Release目录

DotnetNewLib

|-- Library.cs

|-- project.json

|-- project.lock.json

+—bin

     +—Debug

              |-- DotnetNewLib.1.0.0.nupkg

              |-- DotnetNewLib.1.0.0.symbols.nupkg

              +-- netstandard1.6

                          |-- DotnetNewLib.deps.json

                          |-- DotnetNewLib.dll

                          +-- DotnetNewLib.pdb

     +—Release

              |-- DotnetNewLib.1.0.0.nupkg

              |-- DotnetNewLib.1.0.0.symbols.nupkg

              +-- netstandard1.6

                          |-- DotnetNewLib.deps.json

                          |-- DotnetNewLib.dll

                          +-- DotnetNewLib.pdb

在Release目录下 生成了2个文件DotnetNewLib.1.0.0.nupkg 和DotnetNewLib.1.0.0.symbols.nupkg,第一个文件就是我们想要的nuget包。我们来看下Nuget 包里的具体内容,我们可以用

NuGet Package Explorer 工具打开DotnetNewLib.1.0.0.nupkg:

里面仅有一个 lib 文件 netstandard1.6 目标配置文件。这意味着,我们 NuGet 包只适用于.Net Core 应用程序 针对 NetStandard1.6 (和即将到来的 4.6.3),文章 拥抱.NET Core,如何开发一个跨平台类库 (1)

对Nuget包做了很好的说明了,推荐大家阅读, 园子里还有一篇《用命令行工具创建 NuGet 程序包》对Nuget 的详细内容做了讲解。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

ASP.NET 5运行时升级到Beta5

在Visual Studio 2015 RTM和Windows 10正式发布之前,微软把开源.NET升级到了beta5,带来了一些增强和改变。和Visual S...

22980
来自专栏charles的技术博客

CentOS 7使用elrepo源升级内核到最新版本

[root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

89900
来自专栏依乐祝

使用Visual Studio Code开发.NET Core看这篇就够了

在本文中,我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发,测试以及调试。尽管Visual...

24000
来自专栏hbbliyong

使用Visual Studio 调试断点不起作用的问题解决办法 调试Revit CAD 不能进入断点

随着Visual Studio 2010正式版的发布,相信不少人都像我一样升级到了Visual Studio 2010。那么您在使用VS2010在AutoCAD...

419120
来自专栏大内老A

ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件

虽然ASP.NET Core是一款“动态”的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件、CS...

20750
来自专栏DeveWork

Sublime text 3 中Package Control 的安装与使用方法

Package Control插件本身是一个为了方便管理插件的插件,在Sublime text 3中,Package Control 的安装方法一开始出来的方法...

76980
来自专栏张善友的专栏

ASP.NET 4 AppFabric 输出缓存提供程序

缓存是用来保存你数据的地方,从而使你的应用程序访问更快速。缓存可以根据你的需要分配到许多台机器上,而开发人员无需关心数据究竟在哪台机器上。为了获得超快的性能,你...

20890
来自专栏林德熙的博客

Visual Studio 自定义项目模板

经常需要新建一个项目,项目有很多重复的东西,如然后新建View文件夹,ViewModel文件夹,Model文件夹,还有把我们的ViewModelBase放入Vi...

29610
来自专栏开发与安全

学习 Android Application Security Series 时需要注意的一些点

最近想扩展学习下 Android 应用安全,找到一份入门指引  ,大概走了一遍,有一些注意的点且记下。 1. 建议下载的 Appie 版本为 2.0,因为作者写...

20600
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Bower管理前端JavaScript和CSS依赖项

Bower是前端模块的包管理器,通常由JavaScript和/或CSS组成。它使我们可以轻松搜索,安装,更新或删除这些前端依赖项。

6500

扫码关注云+社区

领取腾讯云代金券