如何从零开发一个NuGet软件包?
作者:依乐祝
首发地址:https://www.cnblogs.com/yilezhu/p/14175019.html
我想目前每个.net开发人员都应该知道nuget.org和NuGet软件包吧。但是,您是否曾经尝试并创建过一个nuget包呢?Nuget软件包比较容易引入到类库中。因此,可以使用NuGet软件包管理器将nuget软件包添加到任何项目中。
Nuget包的剖析
Nuget软件包不仅是dll文件。NuGet包是可移植的,它包含您要放入.Net项目中的所有内容。您可以在其中放置txt文件或png文件。这就是为什么我们称它们为“包裹”。您可以打包一些开发文件,并将它们以.nupkg格式在项目之间移动。
我刚刚解压缩了InputKit的nuget包,您可以在下图中看到nupkg文件的树状视图。

因此,只需查看其中的文件夹和文件。
icon.png:
这是您的NuGet包的图标文件。现在已将其嵌入.nupkg中,但在早期版本的NuGet中只能定义为url。
.nuspec
nuspec是关于nuget包的元数据文件。在早期版本中,它曾经用于打包nuget包。但是在新的dotnet CLI中,此文件是由roslyn编译器从您的.csproj文件生成的。它包括软件包的目标框架,名称,许可证,图标,标签,与其他包的依赖关系以及其中描述的要放置到添加的项目中的静态文件。
[Content_Types] .xml:
这是一个元数据文件,提供了程序包中包含的每个文件扩展名。
lib:
软件包的主文件夹。此文件夹包括您的构建输出。换句话说,它在构建之后包含了bin文件夹。所以您可以看到不同目标框架的文件夹与项目输出相同。例如,如果您的.csproj文件是多目标的,您可以像我一样看到每个目标框架的文件夹。
package:
此文件夹包含有关您的包的更多元数据文件。此数据与您在nuget软件包列表中看到的数据相同:“创建者”,“描述”,“标识符”,“版本”和“关键字”。
_rels / .rels:
这是xml格式的文件扩展名,由Microsoft创建和使用。您可以从此处查看有关.rels格式的更多信息。它主要用于Microsoft Office。
创建你的第一个库
每一个开发者都应该知道类库。它们很难移动或用于不同的项目。因为它们的输出是dll文件。在本文中,我不会谈论如何构建库。我将展示如何将它们转换为可移植的nuget包。因此,让我们从第一步开始。
1-选择目标框架
选择目标框架是非常重要!只需计划你的项目并定义依赖项即可。如果您的依赖项需要.net core(如实体框架)或以.Net core为目标的对象,只需将目标框架选为“.Net core”。但如果不是,请始终尝试在“.Net Standard”上构建库。顺便说一句,你可以建立一个多目标项目。您可以从此处阅读有关多目标项目的更多信息。
2-填充元数据
在我们所处的时代,MetaData是最重要的事情。MetaData可以更轻松地找到您的包裹并最好地描述其作用。因此,请正确填写您的元数据。在Visual Studio中创建类库后,只需右键单击并转到属性。您可以在“打包”标签下看到所有可以填写的字段。
如果您的环境不是Visual Studio,则可以直接修改.csproj文件,如下所示。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageId>My.Package</PackageId>
<Version>1.0.1</Version>
<Authors>enisn</Authors>
<Company>enisn</Company>
<Product>My Package</Product>
<Description>This is my packages description.</Description>
<Copyright>All rights reserved</Copyright>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/enisn/MyPackage</PackageProjectUrl>
<RepositoryUrl>https://github.com/enisn/MyPackage</RepositoryUrl>
<PackageTags>my,awesome,package</PackageTags>
<PackageReleaseNotes>Hot fixes</PackageReleaseNotes>
</PropertyGroup>
</Project>
3-打包!
这就是奇迹发生的地方!准备好你的代码,右键单击您的项目,然后单击“打包”按钮。您的nupkg文件将在您项目的bin文件夹中等待着您。
如果您的开发环境不是Visual Studio,则可以使用命令提示符来执行此操作,如下所示:
dotnet pack My.Package.csproj
4-与全世界分享!
转到nuget.org并登录到你的帐户。然后导航到“发布”选项卡,并将您的.nupkg文件拖放到该页面中。填写有关包裹的信息字段并提交。仅此而已!这是在nuget.org上发布软件包的最简单方法。
使用命令行工具
但是您也可以在命令行下执行此操作。让我们来看看这种方式。
首先,您需要一个Api-Key与nuget API通信。转到nuget.org上的个人资料,然后找到“ API密钥”部分,如下所示。

创建一个API密钥并保存它。您将无法再次看到它。因此,您需要保存它。
现在,从打包开始,然后您可以通过CLI进行推送。
dotnet pack --configuration Release -o .packages/
这意味着在发布模式下构建项目,并将输出文件放置到“ .packages”文件夹中。因此,我们可以轻松地从.pacakges文件夹中找到输出。因此,您的nupkg文件已准备好推送。使用以下命令将软件包推送到nuget.org或您自定义的源:
dotnet nuget push .\.packages\My.Pacakge.1.0.1.nupkg --source [https://api.nuget.org/v3/index.json](https://api.nuget.org/v3/index.json) --api-key YOUR_API_KEY --skip-duplicate
我使用了 skip-duplicate 参数,因为如果要配置 CI ,则可以多次推送相同版本的软件包,而如果要推送已经存在的版本,则会出现错误,并且 CI-CD 进程将失败。因此,使用 skip-duplicate 参数忽略已存在的版本推送,并成功完成操作。
感谢您的阅读,我们下篇文章见!
翻译自:https://enisn.medium.com/how-to-develop-a-nuget-package-d37400d9e1d3
如何从零开发一个NuGet软件包?的更多相关文章
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...
- 【Nodejs】326- 从零开发一个node命令行工具
本文由 IMWeb 社区授权转载自腾讯内部 KM 论坛.点击阅读原文查看 IMWeb 社区更多精彩文章. 什么是命令行工具? 命令行工具(Cmmand Line Interface)简称cli,顾名思 ...
- 【原创】新手入门一篇就够:从零开发移动端IM
一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...
- 《IM开发新手入门一篇就够:从零开发移动端IM》
登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页 即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM 帖子 打赏 分享 发表评论162 想开 ...
- 今天介绍一下自己的开源项目,一款以spring cloud alibaba为核心的微服务架构项目,为给企业与个人提供一个零开发基础的微服务架构。
LaoCat-Spring-Cloud-Scaffold 一款以spring cloud alibab 为核心的微服务框架,主要目标为了提升自己的相关技术,也为了给企业与个人提供一个零开发基础的微服务 ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- 拥抱.NET Core,如何开发一个跨平台类库 (1)
在此前的文章中详细介绍了使用.NET Core的基本知识,如果还没有看,可以先去了解“拥抱.NET Core,学习.NET Core的基础知识补遗”,以便接下来的阅读. 在本文将介绍如何配置类库项目支 ...
- 使用 AngularJS 开发一个大规模的单页应用(SPA)
本文的目标是基于单页面应用程序开发出拥有数百页的内容,包括认证,授权,会话状态等功能,可以支持上千个用户的企业级应用. 下载源代码 介绍 (SPA)这样一个名字里面蕴含着什么呢? 如果你是经典的S ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)
文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...
随机推荐
- nginx学习http_auth_basic_module模块
对2.html页面做授权操作 先进行账号密码的生成 使用 htpasswd -c /etc/nginx/auth_conf 用户名 输入2次密码 (如果没有htpasswd,可以使用yum - ...
- 2017-2018 ACM-ICPC Latin American Regional Programming Contest J - Jumping frog 题解(gcd)
题目链接 题目大意 一只青蛙在长度为N的字符串上跳跃,"R"可以跳上去,"P"不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1 ...
- C语言中Linux环境下编译与链接
编写一个简单的 hello.c 文件,以此为例. 1.编译并链接一个完全包含于一个源文件的C程序. gcc hello.c gcc -Wall hello.c gcc -o hello hello.c ...
- 软件工程与UML第二次作业
博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...
- jdk从1.8降到jdk1.7失败
1.将JAVA_HOME:的路径更改为1.7的相关路径,例如我的:C:\Java\jdk1.7.0_80 2.此时查看版本:Java -version,如果是1.8的版本,就把path路径下的%JAV ...
- 20200428_在centos7.2上挂载ntfs和备份文件到移动硬盘
[root@localhost ~]# fdisk -l 磁盘 /dev/sda:2000.4 GB, 2000398934016 字节,3907029168 个扇区 - 设备 Boot Start ...
- 并发编程实战-ConcurrentHashMap源码解析
jdk8之前的实现原理 jdk1.7中采用的数据结构是Segment + HashEntry 的方式进行实现.主要的结构如下图: ConcurrentHashMap 并不是将每个方法都在同一个锁上同步 ...
- 第7.7节 案例详解:Python类继承机制
本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一. 定义父类Vehicle class Vehicle(): def __ ...
- Python中repr(变量)和str(变量)的返回值有什么区别和联系
Python中repr(变量)和str(变量)都返回一个描述对象的字符串,二者有关联又有不同.由于Python3.0后都是新式类,我们的分析也是基于新式类进行的.基于object派生的新式类中二者之间 ...
- 凌乱的与ctf无关的小知识点
(1)在网页中一般不要用记住密码.否则想要知道你的密码很简单. 例子:看样子很安全,别人无法通过这些来获得你的其他密码(尤其是想我这样密码强度不高的人),但是知道要修改前端的选项,你的密码就会被暴露. ...