前言

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 打包工具是不认识的,这些动态引用就不会被打包,等其他人安装包就会出错,文件缺失。如果我要把这些文件一起打包,需要编辑项目文件,就像这样:

  1. <ItemGroup>
  2. <Content Include="x64\*.dll" Pack="true" PackageCopyToOutput="true" PackagePath="x64">
  3. <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  4. </Content>
  5. <Content Include="x86\*.dll" Pack="true" PackageCopyToOutput="true" PackagePath="x86">
  6. <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  7. </Content>
  8. <Content Include="CoreDX.vJoy.Wrapper.targets" Pack="true" PackageCopyToOutput="true" PackagePath="build/">
  9. <CopyToOutputDirectory>Never</CopyToOutputDirectory>
  10. </Content>
  11. </ItemGroup>

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3. <ItemGroup>
  4. <None Include="$(MSBuildThisFileDirectory)\..\x86\vJoyInterface.dll">
  5. <Link>x86\vJoyInterface.dll</Link>
  6. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  7. </None>
  8. <None Include="$(MSBuildThisFileDirectory)\..\x86\vJoyInterfaceWrap.dll">
  9. <Link>x86\vJoyInterfaceWrap.dll</Link>
  10. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  11. </None>
  12. <None Include="$(MSBuildThisFileDirectory)\..\x64\vJoyInterface.dll">
  13. <Link>x64\vJoyInterface.dll</Link>
  14. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  15. </None>
  16. <None Include="$(MSBuildThisFileDirectory)\..\x64\vJoyInterfaceWrap.dll">
  17. <Link>x64\vJoyInterfaceWrap.dll</Link>
  18. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  19. </None>
  20. </ItemGroup>
  21. </Project>

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

结语

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

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

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

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

  完整源代码:Github

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

为 .net 生态贡献力量——制作并上传 nuget 包(内有独家彩蛋)的更多相关文章

  1. 使用Github Packages功能上传nuget包到Github

    前几天微软收购npm的新闻对于软粉来收很是振奋.微软收购npm很可能是为了加强Github Packages.目前Github,Typescript,VSCode,npm这些开源社区的重磅工具全部都在 ...

  2. 【原创】使用批处理脚本自动生成并上传NuGet包

    Hello 大家好,我是TANZAME,我们又见面了. NuGet 是什么这里就不再重复啰嗦,园子里一搜一大把.今天要跟大家分享的是,在日常开发过程中如何统一管理我们的包,如何通过批处理脚本生成包并自 ...

  3. 手把手教你 通过 NuGet.Server 包 搭建nuget服务器,并使用桌面工具上传 nuget 包,免命令行

    新建web项目 工具:VS2013 版本:.Net Framework 4.6,低版本也行,不过要找到对应版本的Nuget.Server 装了NuGet客户端(百度如何安装) WebForm或MVC都 ...

  4. win10 uwp 上传Nuget 让别人用我们的库

    Nuget 我们的开发经常使用别人的dll,那么我们需要每次都从网上下载,然后复制到我们的项目, 而不知道我们的dll是否安全? 当我们的库更新的时候,我们又需要从网上搜索,这样不好,于是我们就用Nu ...

  5. maven安装 maven上传jar包到库里面

    maven的安装与配置:http://pansanday.blog.163.com/blog/static/381662802012727103454743/ maven上传jar包到库里面: 将私有 ...

  6. (转)上传jar包到nexus私服

    场景:在使用私服Nexus时候经常需要上传jar包,但是对上传jar包的方式不是很熟悉,所以很有必要学习下. 1 通过网页上传 GAV Definition:选择GAV Parameters 输入JA ...

  7. Maven第四篇【私有仓库、上传jar包、引用私服jar包、上传本地项目到私服】

    搭建私有服务器 前面已经说过了,我们使用Maven的使用,如果需要导入相对应的jar包,Maven首先会在我们的本地仓库中寻找->私有仓库->中心仓库- 然而,我们的本地仓库常常没有想要的 ...

  8. Maven上传jar包到私服

    1.认证,在M2_HOME/conf/settings.xml配置用户名密码 <server> <id>releases</id> <username> ...

  9. maven上传jar包到nexus私服后的存放路径 以及 使用IDEA上传jar包的步骤

    maven上传jar包到nexus私服的方法,网上大神详解很多,那么上传后的jar包存放到哪里了呢? 在下使用nexus3.2.1版本,在本地搭建了私服,使用maven上传jar包.最后结果如下: 点 ...

随机推荐

  1. 红灯区:DevOps 建设的思考和实践

    点击关注"有赞coder" 获取更多技术干货哦- 作者:费解 团队:效能改进 背景 众所周知,在丰田精益生产中,核心观念包含对人的尊重.消除浪费.持续改善,只有这样,企业才能保持良 ...

  2. 支持向量机 SVM - Wenjing

    概念 将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面.在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化.假定平行超平面间的距离或差距越大, ...

  3. PyCharm 介绍、安装、入门使用

    一.Pycharm介绍 前面几年的时间,我一直用的eclipse,后面开始听同事说用IntelliJ IDEA了,而且说是目前业界最好用的java开发工具,IDE(集成开发环境),没有之一.PyCha ...

  4. centos7开启ntp并同步时间到指定时区

    前提:近期公司都是使用的直接对外的云服务器,在登上服务器后用date命令查看新服务器的时间,发现并不是标准时间,于是需要做时间同步.我这里讲的是能连接外网的情况下,在服务器不多的情况下是否此方法,大型 ...

  5. 360若真入股HTC 到底是谁来拯救谁

    到底是谁来拯救谁" title="360若真入股HTC 到底是谁来拯救谁"> 我总是持有一种观点,那就是拯救是相互的.就像老师拯救"堕落"学生, ...

  6. linux-深度学习环境配置-Centos

    下载Centos 7安装镜像,制作启动优盘. Install CentOS 7 安装CentOS 7. 第一步,配置日期.语言和键盘. 第二步,选择-系统-安装位置,进入磁盘分区界面.选择-其它存储选 ...

  7. 树的三种DFS策略(前序、中序、后序)遍历

    之前刷leetcode的时候,知道求排列组合都需要深度优先搜索(DFS), 那么前序.中序.后序遍历是什么鬼,一直傻傻的分不清楚.直到后来才知道,原来它们只是DFS的三种不同策略. N = Node( ...

  8. Windows系统在Python2.7环境下安装numpy, matplotlib, scipy - Lichanghao Blog

    numpy, matplotlib, scipy三个包是科学计算和绘图的利器.安装它们既可以在网上下载exe安装包,也可以用python内置的包管理工具来下载安装,后者较为方便. 这几天做美赛要用到, ...

  9. 使用BIND搭建内部DNS服务

    ​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌ ...

  10. 解决Request中参数中文乱码问题

    1.使用配置过滤器的方式解决 在web.xml中增加过滤器: <!--配置解决中文乱码的过滤器--> <filter> <filter-name>character ...