- ✏️ 前言
- Exercise: Write a Good CLI Program">📝 Exercise: Write a Good CLI Program
- Reading: The Cargo manifest format">📒 Reading: The Cargo manifest format
- Reading: Cargo environment variables">📒 Reading: Cargo environment variables
- Reading: Rust API Guidelines: Documentation">📒 Reading: Rust API Guidelines: Documentation
- Project: The Rust toolbox">📦 Project: The Rust toolbox
PingCap Talent Plan 学习笔记
我会在闲暇时间来分享一些Rust的学习体会,内容尽可能是时下最新的,也欢迎各位来与我一起交流,内容喜欢的话可以点赞关注我❤️️
ℹ️ 本文主题内容源自PingCap Talent Plan, 这里记录的是一些可以配合使用的个人理解,请结合原内容阅读
✏️ 前言
焦虑
Rust给刚入门编程的我带来了前所未有的成就感,给我一个依赖的文档,结合Rust史上最强的语法检查,很多事情都可以稳稳地做下来,并且出错的概率是非常小的。
但是这些成就感其实来的并不真实,说到底我还是一个优秀的包管理系统的收益者。
Rust现在给人很大的焦虑还是社区的发展,缺乏顶尖开发者的Rust社区有很多优秀的项目难以继续维系下去。
如果我没有能力去贡献一些Rust项目的话,其实会让我非常不安的。
Rust急需大量的贡献者,如果大部分只是一直吃着Rust带来的红利的话,Rust的发展速度绝对会滞后,最终走向覆灭。
为什么选择PingCap Talent Plan
我认识的大佬让我对PingCap这个公司有了极高的好感度,PingCap在Rust方面有一个PingCap Talent Plan。
把PingCap Talent Plan学好,这就是我最近想要做的一件事情。
我认为如果做完这个计划,我有比较大的概率能够拥有参与到Rust开源开发的行列中去的能力。
关于这篇博客
所以这是PingCap Talent Plan当中的PNA Rust — Building Blocks 1和PNA Rust Project 1: The Rust toolbox,PNA是Practical Networked Applications in Rust的缩写,是PingCap Talent Plan二系列(Rust Programming)的第一部分。
一系列(Open Source Collaboration)主要是阅读理解,我觉得大家应该都会,我也不是搞翻译的,所以这部分我跳过了,如果有必要去补强一系列的话,我才会在博客里更新。
有关PNA包含的内容,大家可以看课程README。主要是和网络编程、异步、依赖还有Rust基础有关。
错误处理、日志存储、基准测试还有异步编程是我个人比较看重的点,主要原因还是这方面概念我觉得学习的还不够好。你们关注的又是哪些呢?
课程计划相当于是PNA的一个目录,包含每个部分的链接,还有一些前置准备。
Building Blocks 1是正式内容的开始,包含一个命令行制作练习,以及Cargo清单、环境变量和文档编写的阅读。
那么接下来就开始吧🔥
📝 Exercise: Write a Good CLI Program
不知道是PingCap的人故意想让我们复现结果,还是其它的一些原因,这篇简单的博客给人带来的体验并不良好。
很多博客回头看都是把文档里的东西照搬一遍,然后丝毫不考虑读者的阅读体验,这点我真的非常厌恶。
不过很多时候,我相信这样的问题不是有意而为之的。毕竟写博客真的很累,如何把自己想的表达好更是难上加难。
这篇博客值得肯定的地方,我觉得以我一个不熟悉CLI编程的人来说,作者介绍的方面足够形象也够丰富。
但是介绍clap的时候,贴了一个文档里的.yml
例子,然后又贴了一段编译不了的代码,完全不讲解如何按照运行,这块体验真的不是太好。
当然有的时候这种问题我也无法避免,毕竟这个是个很需要耐心的活。
[dependencies]
clap = { version = "2", features = ["yaml"] }
👆正确的Cargo.toml
配置如上,需要使用yaml feature
。
extern crate clap;
use clap::App;
fn main() {
// The YAML file is found relative to the current file, similar to how modules are found
let yaml = clap::load_yaml!("cli.yml");
let _ = App::from_yaml(yaml).get_matches();
}
👆代码写成这样就可以实现原博客中的效果了。
不太方便的是,要运行你的CLI必须先Cargo build [--release]
,然后再运行target/debug or release
当中的可执行文件。
ℹ️这里我自己有个疑问,是否有办法能build可执行文件到某个特定的位置?
extern crate clap;
use clap::App;
fn main() {
// The YAML file is found relative to the current file, similar to how modules are found
let yaml = clap::load_yaml!("cli.yml");
let m = App::from_yaml(yaml).get_matches();
match m.value_of("config") {
None => println!("no argument"),
Some(args) => println!("{:?}", args)
}
}
博客中还很奇怪的在代码端后面加了一些东西match m.value_of("argument1")
里放的还是注释,直接导致复制的代码没法正常编译。
于是出于好奇,我研究了一下这个value_of
,它的功能简单来说就是获取某个参数的value。
所以我试了一个config
的情况,确实是好使的(因为.yml
里有config这个参数)。
所以为啥又要在贴出来的代码里搞个argument1
,这个就很奇怪…
如果是想让人理解意思的话,应该用注释的代码块。
后面的部分是有关环境变量和错误处理的部分,这块我做web的时候还算比较熟悉,有空再来补充吧。
📒 Reading: The Cargo manifest format
这个阅读介绍的是Cargo清单的格式。
说实话这方面我使用的还是比较少的,除了用dependencies引入一些我要使用的crate以外,我就没有用Cargo清单干过别的事情了。
这篇阅读主要还是对package
字段做了详细的说明,我个人觉得从The workplace field开始的内容会更实用一些,前面的内容就像是在做GitHub项目的基本配置,不会对项目本身造成多大的影响。
最后的specifying dependencies page和the Profiles chapter分别讲了设定依赖和设定编译器的详细内容,个人觉得是非常值得反复来看的,看到了这些了以后,说不定之后的项目里就能做的更细致,考虑的方面更全面。
📒 Reading: Cargo environment variables
这个阅读中记录了一些环境变量的释义,必要时查阅这个文档可以提高自我对项目各方面的认知能力。
dynamic library paths虽然文档中说会很少用到,但从我的经验角度来看,一些环境配置问题都是动态库链接失败导致的,所以应当多多关注。
此外你还可以在程序中获得一些环境变量,来实现一些必要交互,这个其实应该大部分人都知道。
📒 Reading: Rust API Guidelines: Documentation
教你如何撰写文档的阅读,不完全,但是还是非常有意义的。
等到自己写crate文档的时候一定要记得回来看看。
📦 Project: The Rust toolbox
大致内容是做一个简单的kv数据库,然后用clap实现CLI并通过预设好的测试。
但是比较困难的是,安照官方的意思应该是要你从头构建一个可以通过测试的包,这对不习惯查阅cargo文档的同学来说是比较不友好的。
由于官方提供了标程,这个实践我看了一下直接带过了。
大家也可以跳过,如果担心错过了关键知识,可以看一下下面这些你是否清楚:
- dev.dependencies和dependencies的区别
- dev.dependencies不在正常编译项目时使用,例如在这个项目中dev.dependencies是为了test准备的
- cargo clippy 静态代码分析,帮助你写出更好的代码
- cargo fmt 优化你的代码格式
- cargo doc 生成文档
可以发现上面这些都是和之前的阅读有关的。
至于clap的使用,我觉得对CLI有兴趣的可以多看一下,如果没什么兴趣,是可以跳过的,因为读crate的文档是家常便饭,在之后很多场景都会遇到。