对比npm学习Rust的Cargo,一次就搞定。没有Npm,我们就无法编写Node.js代码。这就像在没有Cargo的情况下编写Rust代码。你可能不知道Rust和Cargo。没关系,接下来我们就根据npm学习Cargo,帮助大家快速入门Rust。先从熟悉的Node.js说起:在编写Node.js代码的过程中,我们会先创建一个目录,然后在该目录下执行npminitmkdirnode-procdnode-pronpminit。控制台会交互询问一些信息,然后生成package.json也可以加上-y来使用默认值快速创建。之后我们会使用npminstallxxx来安装依赖,比如安装babelnpminstallbabel。这时候package.json的dependencies下会有babel的依赖信息,会生成一个package-lock.json记录依赖版本(如果用yarn安装就是yarn.lock文件)dependencies会是安装在node_modules下。之后,我们将创建src并编写一些代码。然后在package.json的脚本中指定编译、测试等脚本:代码写好后,通过npmrunbuild运行构建,通过npmruntest运行测试:npmrunbuildnpmruntest生成的产品可以发布到npm仓库通过npm发布。过程中可能还会用到一些其他的命令:比如更新依赖,使用npmupdate,比如搜索依赖,使用npmsearch等。这就是一个Node.js项目的开发过程。不管具体写的是什么Node.js代码,整个工具链都是和npm串联起来的。你可能会说这很基础,这不就是入门的内容吗?是的,npm是你入门Node.js所需要学习的,所以同样,如果你要入门Rust,你必须先学习Cargo。而且npm和cargo的设计非常相似,大家看一遍差不多就知道了。那还等什么,快来了解Cargo吧。写Rust代码的过程和Node.js项目是一样的,可以先创建一个目录,然后使用cargoinit来初始化代码(这里也可以直接使用cargonew,效果和mkdir+下图cargoinit)mkdirrust-procdrust-procargoinit然后会创建这样一个目录结构:cargo.toml相当于package.json,里面也声明了包信息和依赖。而且连src都有了,git也初始化了,比npminit还贴心(难怪大家都喜欢rust,这个工具链多详细)。cargo.toml的内容如下:[package]声明包信息,[dependencies]声明依赖信息。我们使用cargosearch来搜索某个包(相当于npmsearch):可以发现html2md的版本是0.2.13,我们在dependencies中填写:然后我们写一些代码将html转成markdown:然后,compile并执行:cargobuildcargorun可以看到执行结果:我们用npmrunbuild执行的也是build命令,不过是我们自己配置的三方编译工具,而cargo使用的是自带的编译工具。这样我们就运行了我们的第一个rust程序。过程和npm类似吗?而且cargo和yarn.lock或者package-lock.json一样,也有Cargo.lock记录依赖的具体信息:后面也可以执行cargotest运行测试代码,执行cargopublish上传到中央仓库。类似于npm的整体流程。Npm和Cargo相似的原因为什么cargo和npm如此相似?这说明这已经是最佳实践了!即把init脚手架、编译构建、运行、测试、发布等功能集成到一个命令工具中,内置到语言工具链中。对比一下古老的C++就可以看出区别:C++是用clang或者gcc编译的,其他功能是没有的。需要结合cmake来声明一些其他的命令。最重要的是没有中央仓库和依赖管理工具。每个依赖都要手动下载然后放到项目目录下,很麻烦。既然这是必备功能,为什么不将其构建到语言工具链中呢?所以npm和cargo都内置了init、install、update、build、test、publish等命令,并且都支持中央仓库和依赖管理。这是现代语言工具链的最佳实践,其他现代语言工具也会有类似的感觉。总结Cargo之于Rust就像Npm之于Node.js,两者都是用于初始化、依赖管理、构建、发布等的集成命令行工具链。Node.js项目的开发过程如下:npminit初始化projectnpmsearch搜索依赖npminstall安装依赖npmupdate升级依赖npmrunbuild执行构建npmruntest执行测试npmpublish发布到中央仓库Rust项目开发过程也类似:cargoinit初始化项目(或cargonew,this相当于mkdir+cargoinit)cargosearch搜索依赖关系cargoinstall安装依赖关系cargoupdate升级依赖关系手动填充依赖关系到Cargo.tomlcargobuild编译构建代码cargorun运行代码cargotest运行单元测试cargopublish发布到中央仓库虽然具体语法不同,项目结构也不同,整个工具链的流程是si米拉。这是现代语言工具链的最佳实践。相比之下,C++没有依赖管理,没有集成工具链,开发体验远不如用Cargo的rust和用npm的Node.js。其实我们在学习rust或者其他语言的时候,可以和我们熟悉的JS进行对比,因为他们只是使用了不同的计算机抽象,面对的问题相似,只是解决的方法不同罢了。与学习相比,效率会更高。对比npm学习Cargo,看一遍够吗~
