使用 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 的详细内容做了讲解。

使用 Nuget打包类库的更多相关文章

  1. 使用nuget打包类库并发布

    前言 NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库.今天的目的就是记录一下如何打包一个类库,并发布到官网.在开始之前需要在www.nuget. ...

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

    NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系, ...

  3. .NET Core 控制台项目中的Nuget打包类库及引用

    由于使用的是MAC版本的VSCode,所以全部是通过dotnet命令来完成的. 1.dotnet new lib 创建类库项目: 2.编辑项目根目录下的.csproj文件,添加版本号(建议): < ...

  4. Nuget打包类库及引用

    什么是nuget 适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以创建.共享和使用有用的代码. 通常,此类代码捆绑到"包"中,其中包含编译的代码(如 DL ...

  5. dotnet打包类库

    打包类库成Nuget包:dotnet pack --configuration Release --include-source --include-symbols --no-build,注意,需要在 ...

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

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

  7. 利用Nuget打包添加tools下intsall.ps1【powershell脚本】修改.csproj文件

    利用Nuget打包添加tools下intsall.ps1[powershell脚本]修改.csproj文件, 以设置1.项目-生成->输出->选择[XML文件文件] 2.项目->调试 ...

  8. Nuget~打包时添加powershell初始化脚本

    对于进行nuget打包时,有时我们需要添加一个配置文件,就是一些文本文件,而这些文件我们在网站发布时需要同时复制到输出目录,否则会出现文件丢失的问题,我们在打包时通过添加powershell脚本来解决 ...

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

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

随机推荐

  1. linux系统资源信息监控

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  2. puppet report import

    把Puppet报告导入Puppet Dashboard 现在Dashboard正在运行,而我们需要确保它能够获取Puppet报告.完成这项工作有几种方法,开始的时候都是用Rake任务导入旧报告.在/u ...

  3. unittest笔记

    学习资料: 官网: https://docs.python.org/2.7/library/unittest.html IBM Python自动单元测试框架: http://www.ibm.com/d ...

  4. oracle-TNS是什么?

    oracle 的 TNS 是什么的缩写?Transparent Network Substrate(透明网络底层,即无论底层的网络层用什么协议对于上层的应用层都是透明的,也即上层的应用层不用关心底层的 ...

  5. iOS内存管理(一)

    最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...

  6. Java并发编程:线程和进程的创建(转)

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  7. NIO Socket非阻塞模式

    NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...

  8. CComPtr用法

    COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃.所以使用COM接口,必须 ...

  9. [Flexbox] Using flex-direction to layout content horizontally and vertically

    The Flexbox css spec allows for more adjustable layouts. The flex-directionproperty allows you to ea ...

  10. Android消息机制(2)

    在Android 中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易.更好地架构系统,避免一些低级的错误. 下面我们分析下程序的运行过程: 1 ...