0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

cargo-offline命令解读

jf_wN0SrCdH 来源:Rust语言中文社区 作者:Rust语言中文社区 2022-12-01 15:41 次阅读

cargo-offline命令

cargo-offline是标准cargo命令的包装器。其被用来,根据·距离cargo-offline命令执行目录最近的Cargo.toml文件是否被修改过,来给被包装的cargo命令条件地增补--offline命令行参数(即,离线编译)。形象地讲,就是将cargo check条件地变形为cargo check --offline

  1. 项目链接:https://github.com/stuartZhang/cargo-offline

  2. 包仓库链接:https://crates.io/crates/cargo-offline

  3. 代码也精彩,真不是简单的代码堆叠,而是有套路,和讲套路的。

    1. 先点个star

    2. 再直接导航至:https://github1s.com/stuartZhang/cargo-offline

动机

最近一段时间,github.com访问的稳定性实在很差。但,执行cargo命令总是要求

  • 首先,同步crates.io-index索引清单。

  • 然后,执行目标任务

于是,日常开发/编译工作流就时常被阻塞于


	

warning: spurious network error (1 tries remaining): [35] SSL connect error (schannel: failed to receive handshake, SSL/TLS connection failed); class=Net (12) Caused by: Unable to update registry `crates-io` Caused by: failed to fetch `https://github.com/rust-lang/crates.io-index` Caused by: [35] SSL connect error (schannel: failed to receive handshake, SSL/TLS connection failed); class=Net (12)

网络错误上。这实在令人感觉挫败!

另一方面,虽然“搬梯子”能够缓解问题,但面对频繁的cargo check/run指令执行(特别是,莫名其妙出现的“全量索引同步”现象),其“按流量·计费”的经济成本着实令人肉疼。

所以,我下定决心在业余时间搞一个【条件·离线·编译】的命令行工具,来拯救自己于迷茫。

最理想的使用模型

  • 首次编译·或·在依赖项变更时,cargo命令才【连线】编译与同步本地的crates.io-index索引清单 —— 有限且可控的“搬梯子”还是可以经济承受的。

  • 在所有其它时候,cargo命令皆【离线】编译 —— 没事少连线github.com。

工作原理

cargo-offline命令会

  1. 透传所有命令行参数给底层的cargo指令

  2. 寻找距离cargo-offline执行目录最近的Cargo.toml文件,无论该配置文件

    1. 是【工作区workspace】配置文件

    2. 还是【工作区·成员workspace.member】配置文件。

  3. 比较被找到的Cargo.toml文件·是否·被修改过 —— 就是对比该文件的【最后·修改时间】属性值是否发生了变化。

  4. Cargo.toml文件的·最后修改时间·变化了,就给被透传的参数列表额外添加--offline参数项。

  5. 于是,cargo命令就会进入【离线模式】编译了。

Cargo.toml文件修改时间的保存位置

判断Cargo.toml文件·是否·被修改过,关键需要:

  • 缓存·在上一次编译时·读取的Cargo.toml文件【修改时间】属性值

  • 再,使用【缓存·时间值】与当前【文件修改时间】比大小

就将Cargo.toml文件【修改时间】保存于何处,cargo-offline程序提供了两套备选方案:

  • 直接保存到Cargo.toml文件自身里,和作为***.metadata配置块内一个键值对。

    • toml crate编辑过的Cargo.toml文件,它内部

    • 程序·会额外地依赖cargo_toml crate。所以,编译输出的二进制文件会更大那么一点点儿。

    • 编译指令·会额外地开启【不稳定featurefile_set_times

    • “配置块”会被重新排序

    • “双引号”会被替换为“单引号”。

    • 不会在工程目录下引入新文件了。

    • 也不用修改.gitignore文件添加例外规则了。

    • 就【工作区】而言,保存配置块是[workspace.metadata]

    • 就【工作区·成员】和【普通工程】而言,保存配置块是[package.metadata]

    • 优点:

    • 缺点:

  • 保存于独立的*.toml配置文件内。

    • 需手工地向.gitignore文件添加cargo-offline-config.toml文件名。

    • Cargo.toml文件可保持“无损”。

    • 少一个程序依赖项

    • 避免开启【不稳定feature

    • 即,与Cargo.toml文件同目录的cargo-offline-config.toml文件。目前,此文件名是在代码内被硬编码的。

    • 优点:

    • 缺点:

值得一提的是,**Cargo.toml文件【修改时间】保存位置的选择是【编译时·决策】,而不是【运行时·决策】。**即,

  • Cargo features作为编译条件

  • 根据不同的决策选择

  • 编译输出不一样的二进制行可执行文件作为结果。

安装

此命令行工具crate已经被发布至crates.io包仓库。所以,我就未对各主流平台与架构准备·预编译包(感谢伟大的包管理器!)。

  • 选择缓存Cargo.toml文件【修改时间】至Cargo.toml [metadata]的同学,执行这条安装指令:

    
    			

    cargo install cargo-offline --features=cargo-metadata

  • 选择缓存Cargo.toml文件【修改时间】至cargo-offline-config.toml独立文件的同学,执行这条安装指令:

    
    			

    cargo install cargo-offline --features=toml-config

因为我没有给Cargo Package设置default features,所以完全忽略--features=命令行参数会导致源码编译错误。恶作剧地,同时指定--features=cargo-metadata--features=toml-config也会导致编译失败。

一旦被安装成功之后,cargo-offline.exe可执行文件就会

  • 出现在%CARGO_HOME%in目录下

  • PATH环境变量划定的搜索范围,可见

  • 可从命令行直接运行

使用

cargo-offline命令的执行也有两种方式可供选择:

  1. 作为独立命令,执行cargo-offline。后随和标准cargo命令相同的命令行参数(这些参数会被透传给cargo指令的)。比如,

    
    			

    cargo-offline check

  2. 作为cargo指令的子命令,执行cargo offline。比如,

    
    			

    cargo offline check

cargo-offline的命令行参数与cargo完全相同,因为cargo-offline仅只做了透传处理。

源码也精彩,欢迎来品鉴

不是语句的堆叠,而是讲究了“套路”。被涉及到的【设计模式】包括但不限于:

  1. 【条件编译】plus【策略·设计模式】 —— 解决Cargo.toml文件【修改时间】保存位置的选择问题。

    1. 【策略·模式】大约对等于OOP里的【控制反转IoCplus【依赖注入DI】的组合。在我的代码,从IoC容器到DI注入项都是自写的。

    2. 欲深入了解【策略·模式】的细节理论,我推荐文章浅聊Rust【策略·设计模式】Strategy / Policy design pattern —— 欢迎点赞、发评论与转发分享。

  2. Builder设计模式 —— 解决struct局部初始化的问题。

    1. 其大约对等于OOP里【工厂模式】。

    2. 但,亲手给每个struct编写Builder,那不是傻吗!多大的工作量呀!我的选择是derive_builder。

  3. Option / Result枚举类的“拆/装箱”配合器【Combinator模式】 —— 避免丑陋且有panic风险的.unwrap()“拆箱”操作。

    1. 有那么一点儿ramda链式函数调用的感觉了。馁馁的【函数编程·范式】。

  4. 规则宏macro-by-example—— 避免代码重复。

    1. 这是【结构相同·但·类型不同】代码块复用的利器呀!

    2. 以【宏】的思维来复用代码,得花费一段时间来适应。

关于·编译

重要,十分重要:因为【不稳定featurefile_set_times在程序中被条件地开启,所以该Cargo Package工程依赖的rustup工具链被鲜明地锁定于nightly版本。若你git clone此工程至本地,请先安装nightly版的rustc再编译执行之。否则,会报错的。

另外,推荐使用VSCode编辑与编译cargo-offline工程,因为我已经配置好了:

  1. Ctrl + Shift + B直接·编译+执行。

  2. 在安装了CodeLLDB插件之后,F5就先编译,再进入断点调试模式。

无论采用上面哪种方式编译程序,VSCode都会弹出【下拉·选择器】,要求选择输入【自定义cargo feature】。所以,请注意使用【上下箭头】与【回车】键,响应VSCode的选择要求。

后续路图

若今后给该·命令行工具·添加更多功能与配置选项,我计划上【GUI图形界面】,考虑到我的win32Gnome.GTK3编程经历与背景。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4793

    浏览量

    68700
  • 编译
    +关注

    关注

    0

    文章

    659

    浏览量

    32895
  • Win32
    +关注

    关注

    0

    文章

    11

    浏览量

    8128

原文标题:命令

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MOSFET参数解读

    SGT-MOSFET各项参数解读
    发表于 12-30 14:15 1次下载

    Linux系统中shell命令解析

    shell是Linux系统的用户界面,提供了用户与内核交互的一种接口,它接收用户输入的命令并到送到内核去执行,因此也被称为Linux的命令解释器。
    的头像 发表于 11-05 15:40 279次阅读

    详解kubectl常用命令

    详解kubectl常用命令
    的头像 发表于 11-05 15:39 261次阅读
    详解kubectl常用<b class='flag-5'>命令</b>

    Linux实用命令大全

    Linux实用命令大全
    的头像 发表于 10-23 13:50 242次阅读
    Linux实用<b class='flag-5'>命令</b>大全

    Linux lsof命令的基本用法

    在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为
    的头像 发表于 10-23 11:52 298次阅读
    Linux lsof<b class='flag-5'>命令</b>的基本用法

    HarmonyOS高效测试必备HDC命令

    针对测试人员的需求,HDC 提供了丰富的命令集,帮助他们进行设备连接、日志采集、应用安装与卸载、性能监控等。以下是一些常用且对测试人员非常有帮助的 HDC 命令
    的头像 发表于 10-21 11:42 504次阅读

    SD的命令和响应

    一个完整的 SD 卡操作过程是:主机(单片机等)发起“命令”,SD 卡根据命令的内容决定是 否发送响应信息及数据等,如果是数据读/写操作,主机还需要发送停止读/写数据的命令来结束 本次操作,这意味着主机发起
    的头像 发表于 10-08 15:49 528次阅读
    SD的<b class='flag-5'>命令</b>和响应

    SDRAM中的active命令介绍

    在向SDRAM 中的任何行发出 READ或 WRITE 命令之前,必须先打开该行。这是通过 ACTIVE 命令完成的。ACTIVE 命令的目的是打开或者说激活(active)bank中的一行并将数据从 DRAM 移动到bank的
    的头像 发表于 07-29 09:53 467次阅读
    SDRAM中的active<b class='flag-5'>命令</b>介绍

    解读MIPI A-PHY与车载Serdes芯片威廉希尔官方网站 与测试

    上一期,《汽车芯片标准体系建设指南》威廉希尔官方网站 解读与功率芯片测量概览中,我们给大家介绍了工信部印发的《汽车芯片标准体系建设指南》涉及到的重点芯片与测试领域解读,本期继续给大家做延展,我们解读的是MIPI A-PHY与车载Serdes芯
    的头像 发表于 07-24 10:14 2909次阅读
    <b class='flag-5'>解读</b>MIPI A-PHY与车载Serdes芯片威廉希尔官方网站
与测试

    安装esp-idf-tools-setup-offline-5.1.2.exe到结尾运行python时显示应用程序无法正常启动如何解决?

    安装esp-idf-tools-setup-offline-5.1.2.exe到结尾运行python时显示应用程序无法正常启动(0xc000007b),如何解决
    发表于 07-24 07:50

    ZWS云平台应用(6)-设备命令

    本文讲述使用ZWS物联网云平台远程下发设备命令的过程。在生产生活中,很多设备自身有一些控制指令,比如,路灯的开关灯命令、电机的调整转速命令、空调的调温命令等等。当这些设备变成智能设备,
    的头像 发表于 06-26 08:25 289次阅读
    ZWS云平台应用(6)-设备<b class='flag-5'>命令</b>

    lscpu命令使用注意事项

    请注意,lscpu命令在不同的操作系统上可能会有一些差异,某些选项可能不可用。可以通过man lscpu命令或lscpu --help命令查看该命令的帮助文档和更多选项。
    发表于 03-14 11:39 848次阅读

    EMC威廉希尔官方网站 :基础概念到应用的解读

    EMC威廉希尔官方网站 :基础概念到应用的解读?|深圳比创达电子
    的头像 发表于 03-11 11:55 600次阅读
    EMC威廉希尔官方网站
:基础概念到应用的<b class='flag-5'>解读</b>?

    linux命令概述

    电子发烧友网站提供《linux命令概述.pdf》资料免费下载
    发表于 03-11 09:18 3次下载

    Linux基本命令总结

    都说Linux命令多,实际工作中我们又有多少命令会接触用到呢?本文跟大家分享Linux运维工作中常用的600个命令,可以说这些命令是伴随着大家一生的运维生涯了,看看大家有哪些还没用过的
    的头像 发表于 01-11 10:32 981次阅读