前言

nuget 是 .net 的常用包管理器,目前已经内置到 Visual Studio 2012 以后的版本。大多数 .net 包都托管在 nuget.org,包括 .net core 框架基础包,得益于 .net core 的模块化设计,很多非核心包都可以进行一定程度的独立升级。

制作并上传 nuget 包也同时成为为 .net 生态做贡献的重要途经。因为 VS 2019 项目的 csproj 文件支持大量与 nuget 打包相关的配置,所以大多数时候常规的 nuget 包都可以直接用 VS 制作。nuget.org 也只需要上传生成的包文件即可,十分方便。

正文

说明

在此以我上传到 nuget.org 的包 CoreDX.vJoy.Wrapper 为例进行说明。这个包是一个虚拟游戏手柄驱动的 C# SDK 包装,对应 .net core 3.0+ 平台。如果要使用,需要先安装 vJoy 软件。下载地址:http://vjoystick.sourceforge.net/site/index.php/download-a-install/download。叫 vJoy 的软件有好几个,要注意,有些是用来做键盘映射模拟手柄的用户软件,这个是面向开发者的纯编程控制的虚拟手柄,想做键盘映射得自己写软件。

基础操作

1、新建类库项目,取名,然后一路下一步完成新建项目。

2、打开 csproj 文件,调整类库的目标框架,一般情况下尽量使用 netstandard 框架,并尽量降低依赖版本保证兼容性,现在一般是 2.0 居多,早期版本的标准 API 缺失比较严重。也可以右键项目属性进行调整,只不过自由度不如直接编辑项目文件。不过,这些都不是重点,重点是如何同时支持多个框架,这个只能直接编辑项目文件。找到 <TargetFramework>netstandard2.0</TargetFramework>,把 TargetFramework 改成 TargetFrameworks,并用分号隔开不同的框架名。比如我的项目中就是这样:<TargetFrameworks>netcoreapp3.0;netcoreapp3.1</TargetFrameworks>。netcoreapp 也是可以输出为类库的哦。在不同框架使用不同代码实现功能时可以使用条件编译宏解决,例如:#if NETCOREAPP3_1 xxx代码 #endif #if NET461 xxx代码 #endif。然后愉快地写代码。

3、右键项目属性,找到打包选项卡,编辑 nuget 包信息,比如包名、版本、作者、许可证、说明、版权等等信息。还有很多只能直接改项目文件,大多数都可以在 <PropertyGroup> 节点下输入 <Package,然后跳出来的智能提示就是能用的 nuget 包信息节点。其中如果要上传到 nuget.org,包名必须存在且不能与已有包重名;版本每次上传都必须修改且只能更大;许可证必须指定,比如我的:<PackageLicenseExpression>MIT</PackageLicenseExpression> 指定了使用 MIT 许可证授权。

4、项目右键打包。注意如果是要上传的正式版包,需要切换到发行模式再打包。

5、在浏览器打开 www.nuget.org,右上角登录账号,可以使用微软账号或 Github 账号登录。在顶部导航栏找到 Upload,上传,包一般生成到 bin 文件夹。上传完成后会做一些校验并展示预览信息,确认无误后到底部点发布。等待网站进行安全检查和索引创建,一般5到30分钟,就可以在网站和 VS 中找到了。

扩展操作

像我的包,动态引用了 x86 和 x64 程序集,这些引用是在程序运行时动态加载的,也就是说 nuget 打包工具是不认识的,这些动态引用就不会被打包,等其他人安装包就会出错,文件缺失。如果我要把这些文件一起打包,需要编辑项目文件,就像这样:

  <ItemGroup><Content Include="x64\*.dll" Pack="true" PackageCopyToOutput="true" PackagePath="x64"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content><Content Include="x86\*.dll" Pack="true" PackageCopyToOutput="true" PackagePath="x86"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content><Content Include="CoreDX.vJoy.Wrapper.targets" Pack="true" PackageCopyToOutput="true" PackagePath="build/"><CopyToOutputDirectory>Never</CopyToOutputDirectory></Content></ItemGroup>

其中 Pack="true" 表示要将 include 的文件一起打包,PackageCopyToOutput="true" 表示要输出到指定位置, PackagePath 表示把文件输出到包的指定文件夹,因为 nuget 包实际上就是个 zip 压缩文件。

其中 .targets 是个特殊文件,必须打包到 build 文件夹才有用。如果不打包这个文件,其他人安装包后就会发现依然报错,虽然包中确实有文件,但并不会复制到项目中,targets 文件就是负责告诉项目要怎么处理打包进去的额外文件的,是个 xml 文件,自己手动新建一个 xml 文件修改扩展名就行。内容像这样:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><ItemGroup><None Include="$(MSBuildThisFileDirectory)\..\x86\vJoyInterface.dll"><Link>x86\vJoyInterface.dll</Link><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></None><None Include="$(MSBuildThisFileDirectory)\..\x86\vJoyInterfaceWrap.dll"><Link>x86\vJoyInterfaceWrap.dll</Link><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></None><None Include="$(MSBuildThisFileDirectory)\..\x64\vJoyInterface.dll"><Link>x64\vJoyInterface.dll</Link><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></None><None Include="$(MSBuildThisFileDirectory)\..\x64\vJoyInterfaceWrap.dll"><Link>x64\vJoyInterfaceWrap.dll</Link><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></None></ItemGroup>
</Project>

有了这个文件,其他人安装包后,项目会自动读取这个文件并把这些文件引用到项目,确保其他人使用正常。

结语

本来这个东西只是自己写着玩的,结果突发奇想去 nuget 找了一下发现没有完善好用的类似的包,我就想要不上传一个去 nuget 吧。结果就被这个动态引用的 dll 给坑了,打包以后这些 dll 没有引用进来。百度找了半天也没找到解决方案,也懒得搞梯子去谷歌,就直接去 GitHub 找了类似的开源项目源码研究他们是怎么搞的,试了半天才搞定。写下这篇文章记录下心路历程。

这篇文章也算是.Net Core 为 x86 和 x64 程序集编写 AnyCPU 包装的续集。

转载请完整保留以下内容并在显眼位置标注,未经授权删除以下内容进行转载盗用的,保留追究法律责任的权利!

  本文地址:https://www.cnblogs.com/coredx/p/12578978.html

  完整源代码:Github

  里面有各种小东西,这只是其中之一,不嫌弃的话可以Star一下。

为 .net 生态贡献力量——制作并上传 nuget 包(内有独家彩蛋)相关推荐

  1. Django上传文件,制作文件上传按钮,form上传文件

    Django上传文件,制作文件上传按钮,form上传文件 from django.shortcuts import renderfrom django.shortcuts import HttpRes ...

  2. 私有镜像制作及上传harbor私有仓库

    #镜像制作及上传Harbor私有库 ---- #登录harbor ```  docker login -u admin -p Harbor12345 ip:端口 或者直接浏览器输入 默认帐号密码是Ha ...

  3. 镜像制作转换上传操作

    把ISO镜像导入Oracle VM VirtualBox 里创建虚机 必须要做 然后部署完找到VMDK文件 Centos6 CentOS7 Ubantu UOS都必须要做的 centos7制作 yum ...

  4. gradle 上传jar包_gradle 打包jar上传到nexus 同时上传源码jar

    以我们实际项目为例,项目中后台和前台单独开发,之间通过dubbo接口调用,后台提供服务接口,具体实现对前台隐藏,前台使用某个服务时,下载相应依赖然后调用,因此需要将服务接口打成jar包,上传到仓库中, ...

  5. 如何在私服上传jar包

    1.上传jar包到私服,需要先登录帐号 用户名:admin 密码:admin123 2.选择第三方库 3 输入完成后点击Add Artifact 然后点击下方Upload Artifact,如下图所示 ...

  6. npm包的上传npm包的步骤,与更新和下载步骤

    官网: ======================================================= 没有账号可以先注册一个,右上角点击"Sign Up",有账号 ...

  7. 记一次热更新上传补丁包失败问题

    项目用的阿里云的热更新,集成如下: implementation 'com.aliyun.ams:alicloud-android-hotfix:3.2.9' 上传补丁包一直提示失败,提交工单后工程师 ...

  8. 无法获取签名信息,请上传有效包(110506)

    此篇文章将要介绍安卓App提交应用商店时遇到的两个小问题的相关介绍,具体代码请看下文 陆陆续续做了一个半月左右的「喵呜天气」终于在今天下午成功提交到应用商店(腾讯应用宝).期间遇到两个小问题,记录如下 ...

  9. ubuntu tomcat上传目录权限_等了 3 年,Ubuntu Studio 终于有权限上传更新包

    Ubuntu 的衍生版本 Ubuntu Studio 终于选出了两位具有上传更新包权限的开发者. 此前就有媒体报导过,Ubuntu Studio 19.04 版本可能会流产,而原因很让人诧异:社区里没 ...

最新文章

  1. 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc
  2. Django之ORM使用以及模板语言
  3. 温州大学《机器学习》课程课件(一)
  4. django学习笔记之forloop
  5. Oracle中row_number()、rank()、dense_rank() 的区别
  6. CDH6 kafka如何彻底删除topic及数据
  7. 暴怒程序员的呐喊:别让我做那些没用的东西
  8. quartus仿真6:74194构建线性反馈移位寄存器计数器LFSR
  9. 关于oracle存储微信表情emoji问题 “[[%F0%9F%A4%AA]]“
  10. 数据库事务特征、数据库隔离级别,以及各级别数据库加锁情况(含实操)--read uncommitted篇...
  11. 大数据技术原理与应用学习笔记(八)
  12. guice android,android – 如何使用Guice的@Singleton?
  13. Linux-Kali——解决Gnome桌面右键菜单无法打开terminal终端的问题
  14. win7定时关机命令_IT技术分享06:如何让电脑在任何时间自动关机
  15. Unexpected error while obtaining screenshot from device: EOF
  16. linux系统scsi硬盘,Linux系统SCSI磁盘管理全攻略(一)
  17. win10无线网卡(该设备无法启动,代码10)
  18. K近邻(K Nearest Neighbor-KNN)原理讲解及实现
  19. Web的组成架构模型
  20. 学计算机用多大的u盘合适,u盘装系统需要多大的u盘?很多人都做错了!

热门文章

  1. FullCalendar 七:FullCalendar应用——整合农历节气和节日
  2. 企业级数据库备份方案完全攻略
  3. Flex里Application和TitleWindow数据交互方法
  4. 西瓜书机器学习总结(一)
  5. LeetCode 12. Integer to Roman
  6. Linux less命令:查看文件内容
  7. 【C/C++】异或操作巧妙实现两个数的交换操作
  8. 【C++ STL学习之四】容器list深入学习
  9. java演练 循环嵌套 菱形图案的打印 四个阶段完成输出
  10. 钉钉下载与安装过程 适用于windows系统 20200718