如何使用 dotnet pack 打包 .NET 跨平台程序集?

news2024/11/17 22:14:47

如何使用 dotnet pack 打包 .NET 跨平台程序集?

  • dotnet pack 介绍
    • 官方描述
  • dotnet pack 命令说明
  • 使用示例
    • 打包 .net 类库项目
    • 生成带注释的 nuget 包
    • 构建特定平台的 nuget 包
      • 关于 .NET RID 目录

dotnet pack 介绍

dotnet pack 是一个 .NET Core NuGet 包打包程序。

官方描述

dotnet pack - 将代码打包到 NuGet 包。dotnet pack 命令生成项目并创建 NuGet 包。 该命令的结果是一个 NuGet 包,也就是一个 .nupkg 文件。

如果要生成包含调试符号的包,可以使用以下两个选项:

  • --include-symbols:该选项用于创建符号包。
  • --include-source:该选项用于创建带有 src 文件夹的符号包,该文件夹包含源文件。

将被打包项目的 NuGet 依赖项添加到 .nuspec 文件,以便在安装包时可以进行正确解析。 如果打包的项目具有对其他项目的引用,则不会将其他项目包含在包中。 目前,如果具有项目到项目的依赖项,则每个项目均必须包含一个包。

默认情况下,dotnet pack 先构建项目。 如果希望避免此行为,则传递 --no-build 选项。 此选项在持续集成 (CI) 生成方案中通常非常有用,你可以知道代码是之前生成的。

dotnet pack 命令说明

前提条件,安装 .NET Core 3.1 SDK 及更高版本,此处环境安装的是 .NET 8 SDK,在终端执行如下命令:

  • 查看 .net 信息:
PS F:\gitee> dotnet --info
.NET SDK:
 Version:           8.0.101
 Commit:            6eceda187b
 Workload version:  8.0.100-manifests.291ed43a

运行时环境:
 OS Name:     Windows
 OS Version:  10.0.22621
 OS Platform: Windows
 RID:         win-x64
 Base Path:   C:\Program Files\dotnet\sdk\8.0.101\

已安装 .NET 工作负载:
 Workload version: 8.0.100-manifests.291ed43a
没有要显示的已安装工作负载。

Host:
  Version:      8.0.1
  Architecture: x64
  Commit:       bf5e279d92

.NET SDKs installed:
  8.0.101 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 8.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 8.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 8.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download
  • 查看 dotnet pack 命令帮助信息:
PS F:\gitee> dotnet pack -h
Description:
  .NET Core NuGet 包打包程序

用法:
  dotnet pack [<PROJECT | SOLUTION>...] [options]

参数:
  <PROJECT | SOLUTION>  要操作的项目或解决方案文件。如果没有指定文件,则命令将在当前目录里搜索一个文件。

选项:
  -o, --output <OUTPUT_DIR>            要放置生成包的输出目录。
  --artifacts-path <ARTIFACTS_DIR>     工件路径。项目中的所有输出(包括生成、发布和打包输出)都将放到指定路径下的子文件夹 中。
  --no-build                           打包之前不要生成项目。Implies --no-restore.
  --include-symbols                    除了输出目录中的常规包之外,还包括带符号的包。
  --include-source                     包括 PDB 和源文件。源文件放入 nuget 结果包的“src”文件夹中。
  -s, --serviceable                    在包中设置可用标志。有关详细信息,请参阅 https://aka.ms/nupkgservicing。
  --nologo                             不显示启动版权标志或版权消息。
  --interactive                        允许命令停止和等待用户输入或操作(例如,用以完成身份验证)。
  --no-restore                         生成前请勿还原项目。
  -v, --verbosity <LEVEL>              设置 MSBuild 详细程度。允许值为 q[uiet]、m[inimal]、n[ormal]、d[etailed] 和 diag[nostic]。
  --version-suffix <VERSION_SUFFIX>    设置生成项目时使用的 $(VersionSuffix) 属性的值。
  -c, --configuration <CONFIGURATION>  用于生成包的配置。默认值为 "Release"。
  --disable-build-servers              强制命令忽略任何永久性生成服务器。
  --ucr, --use-current-runtime         将当前运行时用作目标运行时。
  -?, -h, --help                       显示命令行帮助。

关于【dotnet pack】更多信息请查看,https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-pack

使用示例

打包 .net 类库项目

  • 创建一个 .net 类库(classlib) 文件,执行命令:
dotnet new classlib -n ClassLibrary1
  • 在创建的类库项目中,添加如下代码:
namespace ClassLibrary1;

public class Class1
{
    public void SayHi() 
    {
        Console.WriteLine("helle, dotnet!");
    }
}
  • 执行 dotnet pack 命令:
dotnet pack \
C:\Users\Jeffrey.Chai\Desktop\test\ClassLibrary1\ClassLibrary1.csproj \
--no-build -o C:\Users\Jeffrey.Chai\Desktop\test\nupkgs \
-c Release \
-p:TargetFrameworks=net8.0 \
-p:PackageVersion=0.0.1

参数说明:

  • --no-build 打包时跳过生成步骤信息;
  • -o|--output 将生成的 nuget 包放置到指定的文件夹中;
  • -c|--configuration 定义生成配置。大多数项目的默认配置为 Debug,但你可以覆盖项目中的生成配置设置;
  • -p:TargetFrameworks 指定生成的 nuget 包依赖 目标框架
  • -p:PackageVersion 指定生成的 nuget 包版本信息;

执行成功后,输出如下信息:

dotnet pack

生成带注释的 nuget 包

通过上面默认的方式构建的 nuget 包是没有注释说明的,在使用的时候看不到包介绍说明不是很方便。

其实想让生成的 nuget 包带注释非常简单,只需要在项目文件加上一个 GenerateDocumentationFile 元数据配置即可。

类库 .csproj 文件完整信息如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <Version>0.0.1</Version>
  </PropertyGroup>

</Project>

添加上面信息后,再次执行 dotnet pack 命令即可。

构建特定平台的 nuget 包

有些时候,项目环境因素,我们可能需要构建特定平台的 nuget 包,我们可以添加 --runtime 参数即可。

  • 打包项目,并使用特定运行时 (Windows 10) 进行还原操作:
dotnet pack --runtime win10-x64

参数说明:

  • --runtime 可以指定特定的 .NET RID 目录

关于 .NET RID 目录

RID运行时标识符 的缩写。RID 值用于标识应用程序运行所在的目标平台。.NET 包使用它们来表示 NuGet 包中特定于平台的资产。 以下值是 RID 的示例:linux-x64、win-x64osx-x64。 对于具有本机依赖项的包,RID 将指定在其中可以还原包的平台。

可以在项目文件的 <RuntimeIdentifier> 元素中设置一个 RID。 可以将多个 RID 定义为项目文件的 <RuntimeIdentifiers> 元素中的列表(以分号分隔)。 也可使用以下 .NET CLI 命令 通过 --runtime 选项使用它们:

  • dotnet build
  • dotnet clean
  • dotnet pack
  • dotnet publish
  • dotnet restore
  • dotnet run
  • dotnet store

表示具体操作系统的 RID 通常遵循以下模式:[os].[version]-[architecture]-[additional qualifiers],其中:

  • [os] 是操作系统/平台系统名字对象。 例如 ubuntu

  • [version] 是操作系统版本,使用的格式是以点 (.) 分隔的版本号。 例如 15.10

版本不应为营销版本,因为营销版本通常代表该操作系统的多个离散版本,且具有不同的平台 API 外围应用。

  • [architecture] 是处理器体系结构。 例如:x86、x64、armarm64

  • [additional qualifiers] 进一步区分了不同的平台。 例如:aot

以下示例演示了 runtime.json 文件中定义的另一个略大的 RID 图表:

linux-arm64     linux-arm32
         |     \   /     |
         |     linux     |
         |       |       |
    unix-arm64   |    unix-x64
             \   |   /
               unix
                 |
                any

关于更多 .NET RID 目录,请查看:https://learn.microsoft.com/zh-cn/dotnet/core/rid-catalog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1413800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发初体验

文章目录 前言一、环境配置1.1 安装DevEco Studio1.2 安装相关环境 二、工程创建三、工程结构介绍四、代码实现4.1 初识ArkTs4.2 具体实现 参考资料 前言 HarmonyOS是华为公司推出的一种操作系统&#xff0c;旨在为不同设备提供统一的操作系统和开发平台。鸿蒙开发的出现为用户…

3d gaussian splatting笔记(paper部分翻译)

本文为3DGS paper的部分翻译。 基于点的&#x1d6fc;混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。 具体来说&#xff0c;颜色 &#x1d436; 由沿射线的体积渲染给出&#xff1a; 其中密度 &#x1d70e;、透射率 &#x1d447; 和颜色 c 的样本是沿着射线以…

排序(插入排序)

现在&#xff0c;我们学习了之前数据结构的部分内容&#xff0c;即将进入一个重要的领域&#xff1a;排序&#xff0c;这是一个看起来简单&#xff0c;但是想要理清其中逻辑并不简单的内容&#xff0c;让我们一起加油把&#xff01; 排序的概念及其运用 排序的概念 排序&…

贾玲新片刚刚发出紧急声明,是什么情况。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 1月22日&#xff0c;一则“多位明星参演的电影涉影视投资诈骗…

浅谈WPF之样式与资源

WPF通过样式&#xff0c;不仅可以方便的设置控件元素的展示方式&#xff0c;给用户呈现多样化的体验&#xff0c;还简化配置&#xff0c;避免重复设置元素的属性&#xff0c;以达到节约成本&#xff0c;提高工作效率的目的&#xff0c;样式也是资源的一种表现形式。本文以一个简…

ARKit 3D 物体检测跟踪

3D 物体检测跟踪 3D物体检测跟踪技术&#xff0c;是指通过计算机图像处理和人工智能技术对摄像机拍摄到的3D物体识别定位并对其姿态进行跟踪的技术。3D物体跟踪技术的基础也是图像识别&#xff0c;但比前述2D 图像检测、识别、跟踪要复杂得多&#xff0c;原因在于现实世界中的物…

【网络协议测试】畸形数据包——圣诞树攻击(DOS攻击)

简介 TCP所有标志位被设置为1的数据包被称为圣诞树数据包&#xff08;XMas Tree packet&#xff09;&#xff0c;之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。 标志位介绍 TCP报文格式&#xff1a; 控制标志&#xff08;Control Bits&#xff09;共6个bi…

单调栈第二天(还没写完)

503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

可以运行在浏览器的Windows 2000

Windows 2000 可以在浏览器里跑了&#xff0c;缺点就是速度慢。 点击这里在浏览器中运行 Windows 2000​​​​​​- --------------------------------------------------------------------------------------------------------------------------------- --------------…

2024年【浙江省安全员-C证】考试题库及浙江省安全员-C证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【浙江省安全员-C证】考试题库及浙江省安全员-C证模拟考试&#xff0c;包含浙江省安全员-C证考试题库答案和解析及浙江省安全员-C证模拟考试练习。安全生产模拟考试一点通结合国家浙江省安全员-C证考试最新大纲…

vue3+naiveUI二次封装的v-model 联动输入框

根据官网说明使用 源码 <template><div class"clw-input pt-3"><n-inputref"input":value"modelValue":type"type":title"title"clearable:disabled"disabled":size"size"placeholder&…

【异常收集】IDEA启动项目遇到的异常汇总,包括插件异常,版本依赖异常,启动异常等以及对应的解决办法

该文章旨在记录开发中遇到的一些异常&#xff0c;以供遇到似错误进行参考修改 一、项目在多个环境下切换&#xff0c;有一次启动后编译失败&#xff0c;报异常 背景&#xff1a;项目在不同环境下有对应的分支&#xff0c;切换分支后运行项目&#xff0c;报错如下 错误:Kotlin:…

前端工程化之:webpack1-6(编译过程)

一、webpack编译过程 webpack 的作用是将源代码编译&#xff08;构建、打包&#xff09;成最终代码。 整个过程大致分为三个步骤&#xff1a; 初始化编译输出 1.初始化 初始化时我们运行的命令 webpack 为核心包&#xff0c; webpack-cli 提供了 webpack 命令&#xff0c;通过…

YouTrack Pending 项目删除

YouTrack 项目在删除的时候可能没有办法马上就删除掉。 我们还会看到类似下面的这种情况。 根据官方的解释说明是&#xff0c;如果项目有很多内容或者有很多的信息&#xff0c;那么在删除的时候会消耗很多的时间&#xff0c;所以 YouTrack 给出了一个 Pending 删除的状态。 哪…

这些SQL你练习过吗?(网友提供的SQL)

行转列SQL练习 题目 把图1转换成图2结果展示 图1 CREATE TABLE TEST_TB_GRADE (ID int(10) NOT NULL AUTO_INCREMENT,USER_NAME varchar(20) DEFAULT NULL,COURSE varchar(20) DEFAULT NULL,SCORE float DEFAULT 0,PRIMARY KEY (ID) )insert into TEST_TB_GRADE(USER_NAME, CO…

[HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Python网络爬虫实战——实验5:Python爬虫之selenium动态数据采集实战

【实验内容】 本实验主要介绍和使用selenium库在js动态加载网页中数据采集的作用。 【实验目的】 1、理解动态加载网页的概念 2、学习Selenium库基本使用 3、掌握动态加载数据采集流程 【实验步骤】 步骤1理解动态加载网页 步骤2学习使用Selenium库 步骤3 采集河北政府采购…

统计学-R语言-8.3

文章目录 前言例题例题一例题二例题三例题四例题五例题六例题七 总结 前言 本篇介绍的是有关方差知识的题目介绍。 例题 例题一 &#xff08;数据&#xff1a;exercise7_3.RData&#xff09;为研究上市公司对其股价波动的关注程度&#xff0c;一家研究机构对在主板、中小板和…

PHP伪协议使用姿势

php支持的伪协议 1 file:// — 访问本地文件系统 2 http:// — 访问 HTTP(s) 网址 3 ftp:// — 访问 FTP(s) URLs 4 php:// — 访问各个输入/输出流&#xff08;I/O streams&#xff09; 5 zlib:// — 压缩流 6 data:// — 数据&#xff08;RFC 2397&#xff09; 7 glob:// —…

YARN介绍

1 概念 YARN 是一个资源管理、任务调度的框架&#xff0c;主要包含三大模块&#xff1a;ResourceManager&#xff08;RM&#xff09;、 NodeManager&#xff08;NM&#xff09;、ApplicationMaster&#xff08;AM&#xff09;。其中&#xff0c;ResourceManager 负责所有资 源…