最近在看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

创建.NET Core程序的Nuget Package的更多相关文章

  1. 【.Net Core】Assets file project.assets.json not found. Run a NuGet package restore

    问题起因 添加 .net core的Project build失败. 提示以下error: Assets file project.assets.json not found. Run a NuGet ...

  2. 流程自动化RPA,Power Automate Desktop系列 - DotNet Core打包并发布Nuget Package

    一.背景 DotNet Core通常基于Nuget来实现包管理,如果你想要把自己的实现共享给其他人,通常我们需要把本地项目打包好,然后发布到对应的Nuget Server上,以便于其他人可以查找.安装 ...

  3. 10分钟 在linux里创建.net core helloworld控制台程序

    官方教程 安装linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :选择和你本机适用的Linux版本,我这里用的是18.04. 第 ...

  4. 在VS 2017 下创建 Xamarin NuGet Package

    最近在做一个Xamarin for android的项目,有个需求是一次可以从相册中选择多张图片,但是 android API<19 的版本还不支持一次选择多张图片,在网上找了一下,发现原生的组 ...

  5. vs2017创建.net core 应用程序,发布到Linux

    1.打开vs2017,创建.net core 应用程序 压缩上传到linux

  6. 使用 dotnet CLI 来打包和发布 .NET Core nuget package

    原文链接:使用 dotnet CLI 来打包和发布 .NET Core nuget package 如何使用 visual studio 2015/2017 打包和发布 Nuget package, ...

  7. .net core创建控制台应用程序和mvc程序

    一.创建控制台应用程序 1.查看支持哪些类型:dotnet new --help 2.创建项目(先定位到需要创建的目录) dotnet new console -o ./myconsole 3.查看目 ...

  8. 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布

    一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...

  9. vscode 创建.net core项目初体验

    微软的virtual studio编辑器那是宇宙第一大编辑器,可惜就是太笨重,遇到性能差一些的电脑设备,简直无法快速的编辑项目. 而vs code编辑器轻便易用,想要编辑哪种项目,只需扩展插件就OK, ...

随机推荐

  1. Solr相似度算法三:DRFSimilarity

    该Similarity 实现了  divergence from randomness (偏离随机性)框架,这是一种基于同名概率模型的相似度模型. 该 similarity有以下配置选项: basic ...

  2. java随笔——HashMap与红黑树

    前言: hashmap是一种很常用的数据结构,其使用方便快捷,接下来笔者将给大家深入解析这个数据结构,让大家能在用的时候知其然,也知其所以然. 一.Map 首先,从最基本的讲起,我们先来认识一下map ...

  3. 不用外部插件启用u盘ntfs写功能

    mac下启用NTFS u盘读写功能. 不用要任何外部插件,其实mac本来就支持,只是因为专利原因隐藏了而已. macbook:~ uwe$ sudo umount /Volumes/UNTITLED ...

  4. 遇到问题-----cas4.2.x登录成功后报错No principal was found---cas中文乱码问题完美解决

    情况 我们之前已经完成了cas4.2.x登录使用MongoDB验证方式并且自定义了加密. 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密 但是悲剧的是 ...

  5. iOS Objective-C 中 bool 与 BOOL 的你不一定知道的事

    测试一下这段代码: - (void)test { NSLog(@"this is an attribut: %d", anAttribute); ; i < ; i++) { ...

  6. RabbitMq初探——用队列实现RPC

    rabbitmq构造rpc 前言 rpc——remote procedure call 远程调用.在我接触的使用过http协议.thrift框架来实现远程调用.其实消息队列rabbitmq也可以实现. ...

  7. “全栈2019”Java异常第二十章:自定义异常详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  8. jmeter+ant+jenkins+mac报告优化(一):解决Min Time和Max Time显示NaN

    一.在上篇博客中生成的报告有两个问题: 1.date not defined 2.Min Time和Max Time显示成了NaN 二.Jmeter+Ant报告生成原理: 1.在Jmeter的extr ...

  9. HBase二级索引的设计

    摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowK ...

  10. Apache Flume入门指南[翻译自官方文档]

    声明: 根据官方文档选择性的翻译了下,不对请指正 https://flume.apache.org/FlumeUserGuide.html