当前位置: 首页 > news >正文

【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

系列文章目录

【跟小嘉学 Rust 编程】一、Rust 编程基础
【跟小嘉学 Rust 编程】二、Rust 包管理工具使用
【跟小嘉学 Rust 编程】三、Rust 的基本程序概念
【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念
【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据
【跟小嘉学 Rust 编程】六、枚举和模式匹配
【跟小嘉学 Rust 编程】七、使用包(Packages)、单元包(Crates)和模块(Module)来管理项目
【跟小嘉学 Rust 编程】八、常见的集合
【跟小嘉学 Rust 编程】九、错误处理(Error Handling)
【跟小嘉学 Rust 编程】十一、编写自动化测试
【跟小嘉学 Rust 编程】十二、构建一个命令行程序
【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包
【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

文章目录

  • 系列文章目录
    • @[TOC](文章目录)
  • 前言
  • 一、发布配置(Release profile)
    • 1.1、发布配置(Release profile)
    • 1.2、自定义 profile
  • 二、发布 crates.io
    • 2.1、crates.io
    • 2.2、文档注释
      • 2.2.1、文档注释介绍
      • 2.2.2、常用章节
      • 2.2.3、文档注释作为测试
      • 2.2.4、为包含注释的项添加文档注释
    • 2.3、pub use
    • 2.4、发布 crate 步骤
  • 三、Cargo 工作空间(Workspaces)
    • 3.1、工作空间
    • 3.2、创建工作空间
    • 3.3、在工作空间依赖外部 crate
  • 四、安装 二进制 crate
  • 五、使用自定义命令扩展 cargo
  • 总结

前言

到目前为止,我们讲解了 Cargo 的最基本的特性来构建、运行、测试代码,但是它可以为我们做更多的事情。本章节讲解 Cargo 更高级的特性,例如:

  1. 通过 release profile 来自定义构建
  2. 在 crates.io 上发布库文件
  3. 通过 workspaces 组织大工程
  4. 从 crates.io 来安装库
  5. 使用自定义命令扩展 cargo

主要教材参考 《The Rust Programming Language》


一、发布配置(Release profile)

1.1、发布配置(Release profile)

发布配置(Release profile) 是 预定义的,也可以自定义(可以使用不同的配置) 对代码编译拥有更多的控制。每个Profile的配置都独立于其他的Profile。

Cargo 主要两个 Profile:

  • dev profile:适用于开发(开发环境), cargo build
  • release profile:适用于发布(生产环境),cargo build --release

1.2、自定义 profile

针对每个 profile,Cargo 都提供了默认的配置,如果想自定义 xxx profile 的配置,可以在 cargo.toml 里面添加 [profile.xxx] 区域,在里面覆盖默认配置的子集。

[profile.dev]
opt-level = 0[profile.release]
opt-level = 3

opt-level 参数表示优化级别,编译时间比较久。针对每个配置的默认值和完整选项,可以参考 profile

二、发布 crates.io

2.1、crates.io

可以通过发布包来共享你的代码,crate 的注册表 在 crates.io 上,它会分发已注册的包的源代码,主要托管开源的代码。

2.2、文档注释

2.2.1、文档注释介绍

文档注释用于生成HTML文档,显式公共 API的文档注释(如何使用API),使用 /// 来表示 支持markdown 语法。

使用 cargo doc 可以生成文档,它会运行 rustdoc 工具,把生成的HTML文档放在 target/doc 目录下。

使用 cargo doc --open 可以打开生成的文档。

2.2.2、常用章节

  • Examples:示例代码
  • Panics:函数可能发生 panic 的场景
  • Errors:如果函数返回 Result,描述可能的错误种类,以及可导致错误的条件
  • Safety:如果函数处于 unsafe 调用,就可以解释函数 unsafe 的原因,以及调用者确保使用的前提。

2.2.3、文档注释作为测试

示例代码块的附加值:运行 cargo test 可以把文档注释中的示例代码作为测试来运行。

2.2.4、为包含注释的项添加文档注释

  • 符号://!
  • 此类注释通常用于描述 crate 和模块:
    • crate root (按照惯例 src/lib.rs)
    • 一个模块内,将 crate 或模块作为一个整体进行记录

2.3、pub use

使用 pub use 导出方便使用的公共 API。

2.4、发布 crate 步骤

一旦发布,就是永久性,该版本无法覆盖,代码无法删除,目的:依赖于该版本的项目可继续正常工作

1、创建并设置 crate.io 账号,并且获得 api token

2、 运行命令: cargo login [api token],通知 cargo ,你的 api token 存储在本地 ~/.cargo/credentials

3、发布之前需要 在 [package] 上设置元数据。

  • crate 需要唯一的名称:name
  • description:一两句话即可
  • license:需要提供许可证的标识值(可以在 http://spdx.org/licenses/ 查找)。
  • version:可以参照 http://semver.org 来使用你的语义版本
  • author

4、发布:使用 cargo publish 命令

5、使用 cargo yank 撤回版本:

  • 不可以删除 crate 之前的版本
  • 但是可以防止其他项目把它作为新的依赖,但是已经存在的项目可以继续作为依赖

三、Cargo 工作空间(Workspaces)

3.1、工作空间

Cargo 工作空间,帮助管理多个相互关联需要协同开发的 crate。cargo 工作空间就是一套共享同一个 cargo.lock和输出文件夹的包。

3.2、创建工作空间

[workspace]
members = ["adder"
]

运行 :cargo run -p 二进制crate

3.3、在工作空间依赖外部 crate

工作空间只有一个 cargo.lock,在工作空间的顶层目录,保证工作空间内所有 crate 的使用的依赖的版本都相同,工作空间内所有 crate 相互兼容。

四、安装 二进制 crate

  • 命令 cargo install

  • 来源:crates.io

  • 限制:只能安装具有二进制目标(binary target)的crate

    • 二进制目标 (binary target)是一个可运行的程序,由 src/main.rs 或其他被指定为二进制文件的crate 生成
  • 通常在 README 里面有关于 crate 的描述

    • 拥有 binary target
    • 拥有 library target
    • 两者兼备
  • cargo install 安装的二进制目录存在根目录的bin文件夹

  • 如果你使用 rustup 安装的 rust 没有任何自定义配置,那么二进制文件将存放在 $HOME/.cargo/bin。

五、使用自定义命令扩展 cargo

  • cargo 被设计成可以使用自命令扩展
  • 如果$PATH中的某个二进制文件是 cargo-something,你可以像子命令一样运行:cargo something。
  • 类似这样的自定义命令可以通过该命令列出:cargo --list
  • 优点:可以使用cargo install 来安装扩展,像内置工具一样来使用。

总结

以上就是今天要讲的内容

相关文章:

【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

防关联指纹浏览器:高效地管理你的Facebook账户

Facebook,作为全球最受欢迎社交平台的第一名已经成为我们日常和工作中不可或缺的一部分了。不管是用于日常分享、媒体营销、还是店铺运营,Facebook都占据着重要的位置。多个Facebook账户的优势非常明显,然而,当你需要同时管理他们…...

前端学习记录~2023.8.15~JavaScript重难点实例精讲~第7章 ES6(1)

第 7 章 ES6 前言7.1 let关键字和const关键字7.1.1 let关键字(1)let关键字的特性(2)使用let关键字的好处 7.1.2 const关键字(1)const关键字的特性 7.2 解构赋值7.2.1 数组的解构赋值(1&#xff…...

WebSocket详解以及应用

😜作 者:是江迪呀✒️本文关键词:websocket、网络、长连接、前端☀️每日 一言:任何一个你不喜欢而又离不开的地方,任何一种你不喜欢而又无法摆脱的生活,都是监狱! 一、前言 我们在…...

如何评估开源项目的活跃度和可持续性?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

远程Linux/ubuntu服务器后台不间断运行py文件/sh脚本

通常我们在生产环境中运行一些项目时需要将程序不间断的运行在服务器上,并且将日志文件打印到某个文件中,直到程序运行结束,下面介绍了在Linux服务器上不间断运行py文件的方式,以及如何保存相应的日志信息。 对于 .py 文件&#x…...

记录一个诡异的bug

将对接oa跳转到会议转写的项目oa/meetingtranslate项目发布到天宫,结果跳转到successPage后报错 这一看就是successPage接口名没对上啊,查了一下代码,没问题啊。 小心起见,我就把successPage的方法请求方式从Post改为Get和POST都…...

Xamarin.Android中的Fragment

目录 1、Activity中使用Fragment2、Fragment与Activity通信3、Fragment与其他的Fragment通信 1、Activity中使用Fragment 一般而言,会在activity中添加一个加载fragment的方法。通过点击菜单的按钮,加载不同的fragment。其样子一般是这样的:…...

portainer初体验

官方文档 安装 docker 这里采用的的是国内汉化的一个镜像,版本号2.16.2。 地址 docker run -d --restartalways --name"portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce体验 访问9000端口。 尝试&#x…...

4G数传方案(合宙cat1模块)

一. 合宙Cat1简介 合宙 Air724 模组推出的低功耗,超小体积,高性能嵌入式 4G Cat1 核心版,标准的 2.54 排针、最小成本的进项 2G、4G Cat4 切换;主要功能如下: 实际测试工作环境为-35℃-75℃; 支持 5-12V 供电或者 3.7…...

ElasticSearch - 海量数据索引拆分的一些思考

文章目录 困难解决方案初始方案及存在的问题segment merge引入预排序 拆分方案设计考量点如何去除冗余数据按什么维度拆分,拆多少个最终的索引拆分模型演进历程整体迁移流程全量迁移流程流量回放比对验证异步转同步多索引联查优化效果 总结与思考参考 困难 索引数据…...

【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍

【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍 一、高通官网 Chipcode 下载步骤介绍1.1 高通Chipcode 下载步骤1.2 高通 ReleaseNote 下载方法二、高通 HQX 代码介绍2.1 完整的 HQX 代码结构:sa8295p-hqx-4-2-4-0_hlos_dev_qnx.tar.gz2.2 sa8295p-…...

【设计模式--原型模式(Prototype Pattern)

一、什么是原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目的是通过复制现有对象来创建新的对象,而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象,然后通过复制…...

初识 Redis

初识 Redis 1 认识NoSQL1.1 结构化与非结构化1.2 关联和非关联1.3 查询方式1.4. 事务1.5 总结 2 Redis 概述2.1 应用场景2.2 特性 3 Resis 全局命令4 Redis 基本数据类型4.1 String4.1.1 常用命令4.1.2 命令的时间复杂度4.1.3 使用场景 4.2 Hash4.2.1 常用命令4.2.2 命令的时间…...

php灵异事件,啥都没干数据变了?

这篇文章也可以在我的博客查看 搞WordPress&#xff0c;难免跟php打交道 然而这弱类型语言实在坑有点多 这不今儿又踩了个大坑直接时间-1&#x1f605; 问题 话不多说直接上代码 <?php $items [1,2];foreach ($items as &$item) {/*empty loop*/} print_r($items)…...

【ffmpeg】基于需要使用videocapture的opencv编译配置(C++)

目录 配置简介ffmpeg源码编译方法记录gstreamer命令行安装方法opencv的编译项记录 配置简介 opencv使用videocapture读取视频流时&#xff0c;需要借助底层的ffmpeg库。如果不能正确编译&#xff0c;会报错&#xff0c;现记录正确编译配置方法。 ffmpeg源码编译方法记录 ope…...

Redisson分布式锁 原理源码 分析

# 基于setnx实现的分布式锁存在的问题&#xff1a; # 为了解决上面的问题&#xff0c;可以用Redisson # Redisson入门 # Redisson可重入锁原理 获取锁的Lua脚本&#xff1a; 释放锁的Lua脚本&#xff1a; # 锁重试原理分析 tryLock&#xff08;&#xff09;底层代码分析 tim…...

Cocos独立游戏开发框架中的事件管理器

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。在独立游戏开发中&#xff0c;事件管理器是一个不可或缺的组件。它为开发者提供了一种灵活的方式来处理游戏内部各种状态变化和用户交互&#xff0c;实现模块之间的解耦和通信…...

keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群

一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名主机地址软件node-01192.168.157.133rabbitmq、erlang、haproxy、keepalivednode-02192.168.157.134rabbitmq、erlang、haproxy、keepalivednode-03192.168.157.135rabbitmq、erlang 2. 关闭三台机器的防火墙 # 关闭…...

网络安全(黑客)零基础自学

网络安全是什么&#xff1f; 网络安全&#xff0c;顾名思义&#xff0c;网络上的信息安全。 随着信息技术的飞速发展和网络边界的逐渐模糊&#xff0c;关键信息基础设施、重要数据和个人隐私都面临新的威胁和风险。 网络安全工程师要做的&#xff0c;就是保护网络上的信息安…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...