创建.NET Core程序的Nuget Package
最近在看ASP.NET Core MVC的教材,几乎每章开始都要重复从Empty project开始创建一个ASP.NET Core的项目,然后手动修改project.json,增加经典三目录(Models,Controllers,Views)之类的,然后接着基于这个基本项目进行介绍某个特定的功能。
这种示例代码每次都重复创建很没有技术含量,通常都是复制粘贴,所以考虑把这部分示例代码做成一个自动化的。之前有看到有ASP.NET Identity的示例的Nuget程序包,就是安装之后,自动创建了相关的类文件,同时也修改了web.config,最终效果是安装了package之后,直接能起来。
遵循这个想法,也打算创建一个ASP.NET Core MVC的基本示例Nuget包。于是从新复习了一个创建Nuget包的文档,发现情况不是那么直接,用之前基于非.NET Core的程序的创建包的方式,行不通。
查看了Nuget提供的文档说明(https://docs.microsoft.com/zh-cn/nuget/),也没找到很直接的说明如何创建.NET Core程序包的介绍文档,反而看到有介绍创建.NET Standard程序包的文档。这是什么情况,按道理不可能,可能方向不对?直接bing了一下,也没有找到stackflow上的最佳答案,其实也没深入去找,我是觉得自己走错了方向。
于是把介绍创建.NET Standard的文档(https://docs.microsoft.com/zh-cn/nuget/guides/create-net-standard-packages-vs2015)看了一遍,看到前面的介绍终于明白了,原来是换了个壳,没有之前那么直接了,必须通过创建.NET Standard包的方式实现对.NET Core程序的支持。
为什么是.NET Standard?.NET Standard定义了支持所有.NET平台的BCL程序集API,理论上说.NET Standard支持下的程序集可以在多个不同的.NET平台运行,比如.NET Framework,.NET Core, Mono等等。而对于不同的.NET平台,对.NET Standard的版本支持也不同,完成的支持列表可参考https://docs.microsoft.com/en-us/dotnet/articles/standard/library的说明,下图是引用自官网的一个版本支持图
参考需要支持的.NET平台的版本,可以看到平台支持的最高版本的.NET Standard的版本号,同时也说明支持之前版本的.NET Standard。
说的比较拗口,比如我这里需要支持.NET Core程序,而且是.NET Core 1.0版本,那么这个版本支持的最高.NET Standard版本是1.6,同时也兼容1.6之前的版本。
好了前面介绍了一下背景知识,那么了解完之后我们就很清楚如果要创建支持.NET Core的Nuget包,那么我们需要创建一个支持.NET Standard的Nuget包,并且设置支持的版本即可。
结合Nuget官方的文档,我们一步步来创建并发布一个Demo版的支持.NET Core 1.0版本的Nuget包。
1 用Visual studio 2015新建一个Class Library Portable项目
项目名称自定义,通常用于最终Nuget包的名称
2 点击确定之后弹出选择需要的Targets,也就是支持的.NET平台
这里选择支持.NET Framework和ASP.NET Core
3.点击OK之后,项目创建完成,然后右键点击解决方案,打开属性窗口
选择点击”Target.NET Platform Standard”,之后会有一个Confirm,当然是选择“Yes”
然后属性窗口的Target变成了一个下拉选项,这里我们选择.NET Standard1.4版本即可(根据版本支持图,.NET Core 1.0可以支持这个版本)
之后再次Confirm,Yes
3 设置Build,选择Release,并勾选中XML documentation file,后面需要用到
4 到此项目的属性设置完成,然后把默认生成的Class1改一下,好歹改成一些有意义的东西,我改成如下内容。
public class Demo {public void Run(){Console.WriteLine($"You're using my demo package at {DateTime.Now.ToString(CultureInfo.InvariantCulture)}");} }
5 项目代码已经足够了,接下来使用Nuget命令行工具,Nuget命令行工具用的是3.5版本,官方有得下载,这里把Nuget.exe文件放到了项目根目录下。
6 然后CMD到项目所在的目录,运行nuget spec,创建一个spec文件,这个文件干嘛的不多说了,官方文档有详细说明
nuget spec
然后得到一个Shenba.DemoPackage.Core.nuspec文件
7 用文本编辑器,比如notepad++编辑Shenba.DemoPackage.Core.nuspec文件
把各个$符号的变量都改成自己的内容,比如如下内容
<?xml version="1.0"?> <package ><metadata><id>Shenba.DemoPackage.Core</id><version>1.0.0</version><title>Shenba.DemoPackage.Core</title><authors>shenba</authors><owners>shenba</owners><requireLicenseAcceptance>false</requireLicenseAcceptance><description>demo package for dotnet core</description><releaseNotes>demo package for dotnet core released.</releaseNotes><copyright>Copyright 2017</copyright><tags>dotnet core demo package</tags></metadata> </package>
注意id不要相同,否则后面没法提交
8 继续编辑nuspec文件,加入<files>节点(跟metadata一个级别),并设置内容如下
<files><file src="bin\Release\Shenba.DemoPackage.Core.dll" target="lib\netstandard1.4\Shenba.DemoPackage.Core.dll" /><file src="bin\Release\Shenba.DemoPackage.Core.xml" target="lib\netstandard1.4\Shenba.DemoPackage.Core.xml" /> </files>
9 在Release配置下,编译解决方案后,在命令行执行如下命令(还是在项目的根目录下)
nuget pack Shenba.DemoPackage.Core.nuspec
之后会生成一个Shenba.DemoPackage.Core.1.0.0.nupkg文件,这个就是最终要发布的包文件
实际上这是一个压缩包(把后缀名改成zip),可以用RAR工具查看里面的文件结构,如下图
可以看到里面包含了常见的lib目录,并且打开后是netstandard1.4目录,然后是具体的程序集文件和XML文档。
10 接下来就是把这个包发布到nuget.org
发布到nuget.org需要使用自己的账号发布,如果通过命令行发布还需要生成自己的一个API key,具体可以参考https://docs.microsoft.com/zh-cn/nuget/create-packages/publish-a-package的说明。
这里给出发布的package的命令行,其中XXXX是注册后得到的API key
nuget push Shenba.DemoPackage.Core.1.0.0.nupkg XXXX –Source nuget.org
11 push之后是不能立即在nuget搜索到的,这跟之前的非.NET Standard的是一样的,不过可以在自己的Account下看到发布的包
12 在.NET Core项目中使用刚发布的Demo package
这个跟使用普通的.NET Core的Package一样,修改project.json或者使用界面的package manager引入,比如直接在project.json的dependencies节点加入package的引用
{"version": "1.0.0-*","buildOptions": {"emitEntryPoint": true},"dependencies": {"Microsoft.NETCore.App": {"type": "platform","version": "1.0.1"},"Shenba.DemoPackage.Core": "1.0.0"},"frameworks": {"netcoreapp1.0": {"imports": "dnxcore50"}} }
保存之后当然也会自动的restore,然后会显示在引用中
当然代码里调用这个package的类也是没有问题的,调用代码就不说了,就是个示例而已。
13 在.NET Framework 4.6.1的项目中使用该Demo package
一开始提到这个package是基于.NET Standard1.4版本的,根据版本支持图,.NET Framework 4.6.1的项目也是可以引用这个包的。
新建一个.NET Framework 4.6.1的控制台项目,package控制台运行
Install-Package Shenba.DemoPackage.Core
同样也是能正确被引用和调用的,下面是packages.config的内容
<packages><package id="Shenba.DemoPackage.Core" version="1.0.0" targetFramework="net461" /> </packages>
小结
以上是创建并发布一个可用于.NET Core(当然也可用于.NET Framework)的Nuget包过程,大致流程跟发布普通的Nuget包相同,但需要注意选择需要支持的.NET Standard的版本。
后续会准备一个更加有意义的.NET Core包,可用于生成ASP.NET MVC Core的学习示例代码。
(目前针对dotnet core项目的nuget包,还不支持执行包里的代码模板和识别Content内容,所以暂时无法实现
详情参考 https://docs.microsoft.com/zh-cn/nuget/create-packages/project-json-impact)
这个Demo的示例代码路径
https://github.com/shenba2014/AspDotNetCoreMvcExamples/tree/master/DemoPackageCore
转载于:https://www.cnblogs.com/shenba/p/6540026.html
创建.NET Core程序的Nuget Package相关推荐
- 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序
目录 介绍 ScrumPoker应用程序 源代码 开发工具 基本步骤 后端代码 创建Hub 在Startup中注册集线器 创建持久性 让我们为客户端应用程序公开一些终端 启用Cors 前端代码 结论 ...
- 使用插件创建 .NET Core 应用程序
使用插件创建 .NET Core 应用程序 本教程展示了如何创建自定义的 AssemblyLoadContext 来加载插件.AssemblyDependencyResolver 用于解析插件的 ...
- 10分钟 在linux里创建.net core helloworld控制台程序
官方教程 安装linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :选择和你本机适用的Linux版本,我这里用的是18.04. 第 ...
- 使用VS Code 开发.NET CORE 程序指南
1. 前言 近两年来,很多前端的同学都开始将 VSCode 作为前端主力开发工具,其丰富的扩展给程序开发尤其是前端开发带来了很多便利,但是作为微软主力语言的 .NET,却由于有宇宙第一IDE Visu ...
- 基于 .Net Core 的组件 Nuget 包制作 amp; 发布
微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 Nuget 包和发布. 之前 . ...
- activereports_报表 ActiveReports 迎来 .Net Core 时代!一键创建 .Net Core 项目
近期,葡萄城报表控件ActiveReports V14.0 正式发布,全面支持 .NET Core平台.同时,在本次更新中 ActiveReports的桌面报表设计器UI得以全面增强,报表预览方式得以 ...
- 以Windows服务方式运行.NET Core程序
原文:以Windows服务方式运行.NET Core程序 在之前一篇博客<以Windows服务方式运行ASP.NET Core程序>中我讲述了如何把ASP.NET Core程序作为Wind ...
- 使用Azure DevOps Pipeline实现.Net Core程序的CI
上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...
- Grpc Proto To Nuget Package 插件使用说明
Grpc Proto To Nuget Package 是一个 VS 插件(支持 VS2019+),目的是将基于 gRPC 的接口定义 .proto 文件一键转成 Nuget Package,然后发布 ...
最新文章
- 微软职位内部推荐-Principal Dev Manager
- maven 内置参数
- 大道至简 23种模式一点就通
- 我是如何在两天内做完一个网站的
- android中可口的吐司,一种信息提示机制——Toast
- android中对sd卡的 操作文件问题 创建目录 创建文件到指定目录
- 【Java多线程】创建多线程的三种方式
- ABAP 泛型处理的overhead - generic programming
- android炫酷叼ui,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!
- 计算机软著研究生毕业,关于研究生推免工作科研成果和竞赛计分详细说明
- 安卓系统dicom阅读器_麻雀虽小,体验倍儿好——文石 POKE2黑白屏/彩屏电纸书阅读器评测...
- 渗透开发-XSS扫描器
- C++独立游戏存档模块设计
- 华为性格面试的技巧方法
- matlab绘制频谱图代码,用MATLAB实现函数的频谱图
- docker+selenium+node-chrome-debug(node-firefox-debug)完成自动化测试环境的部署
- 计算机网络 华南理工大学期末重点 第二章 物理层 谢希仁
- 小程序直播公测,微信再造电商梦?
- 浮点数比大小(C语言版)
- ndk-build 添加window环境变量
热门文章
- Darwin Streaming Server 安装流程
- 兰州网络教育计算机基础考试,2017年兰州事业单位公共基础备考:计算机基础知识...
- Helm 3 完整教程(三):chart 的文件结构和字段详解
- android原生插件,适用于 Android 的原生 (C++) 插件
- mysql 列 随机数_MYSQL中生产随机数或随机字符串
- 【CCCC】L3-003 社交集群 (30分),并查集模板,map排序
- 【HNOI2003】【BZOJ1216】操作系统(模拟,优先队列)
- 【Luogu1182】数列分段Section II(二分)
- UVa1368 - DNA Consensus String
- 易语言修改虚拟机硬盘id_易语言本地虚拟机源码