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

Rust 之一 基本环境搭建、各组件工具的文档、源码、配置

概述

  Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全,使用其特有的所有权机制,而无需传统的垃圾收集器。Rust 不强制执行编程范式,但受到函数式编程思想的影响。

  1. 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年作为个人项目创建的
  2. Mozilla 于 2009 年正式赞助了该项目
  3. Rust 是一门编译型的语言。最初,其编译器是用大约 38000 行 OCaml 编写,在 2009 年之后,开始用 Rust 语言基于 LLVM 编写自托管编译器
  4. 在 2015 年 5 月发布第一个稳定版

Rust 环境

  一门新的编程语言,除了有自己的词法与语法、类型系统、执行模型等基本语义与核心特性之外,通常还得有配套的工具链(编译器、标准库、链接器)或解释器、包管理器、构建工具等配套的开发工具。
在这里插入图片描述
  通常,根据编译型语言与解释型语言而不同所包含的工具不同,Rust 是一种预编译静态类型(ahead-of-time compiled)的编程语言,因此,它有一套自己的编译工具链以及相关工具。(实际上,还有一种混合型语言,例如,Angular ,这两种方式都支持)
在这里插入图片描述
  许多古老的编程语言,例如,C 语言,其诞生之初就只有语言标准与编译器,而不是一开始就设计有其他一些工具。然后,在以后的其逐渐变为流行的过程中,才诞生了一些配套的开源或者商业的构建工具,编译工具链等等!

Rust 组件

  Rust 编程语言作为一个完全开源的后起之秀,除了有基本的 Rust 编程语言标准之外,Rust 官方还提供了一系列适用于各个平台的开发辅助工具以及编译工具链来帮助我们处理 Rust 代码。
在这里插入图片描述
  所有的这些工具都是由一个名为 rustup 的命令行工具来统一管理!并且,rustup 引入了 componentprofileproxy 等基本概念来组织和管理所有相关工具的发布!

Proxies

  Rust 官方提供了分别适用于 Windows、Linux、MacOS 等目前主流操作系统平台的工具,即使是在同一个操作系统平台下,也有不同的版本,为了统一不同版本的工具的区别,Rust 采用了使用统一的代理程序来作为对外工具,从而屏蔽不同版本工具的差异的方法。
在这里插入图片描述
  当我们安装了 Rust 之后,安装目录的 .cargo/bin 目录中的这些可执行程序(rustup 除外)实际上是 .rustup/toolchains/发行版/bin 中真实工具的包装器,官方称其为 Proxies。 他们都是通过调用 .rustup/toolchains/发行版/bin 目录中的对应工具来实现功能的!
在这里插入图片描述
  .cargo/bin 中包含了所有可用工具的代理,.rustup/toolchains/发行版/bin 却不一定包含所有实际的工具,安装时的 Profiles 实际表示的是要安装到 .rustup/toolchains/发行版/bin 中的组件的多少。
在这里插入图片描述
  仔细观察 .cargo/bin 中的各个可执行文件就会发现他们的大小是一模一样的,这是因为他们(包括安装时使用的 rustup-init)实际上都是 rustup 改成了不同的名字,rustup 程序会根据名字的不同执行不同的操作,后文 Rustup 章节详细介绍。
在这里插入图片描述

Components

  Rust 官方将其提供的开发辅助工具、编译工具链、其他一些库等组织为了 Components 的形式的集合。组件是属于编译工具链,增减组件都是指的增减当前编译工具链中的组件。组件位于 .rustup/toolchains/发行版/ 下对应的子目录中,其中 .rustup/toolchains/发行版/lib/rustlib/components 文件中就记录了针对当前编译工具链安装的组件。

组件名包含的工具介绍
rustcrustcrustdoc编译工具链、文档工具
cargocargo包管理器
rustfmtrustfmtcargo-fmt代码格式化工具
rust-std这是 Rust 标准库。对于 rustc 支持的每个目标平台,都有一个单独的 rust-std 组件。例如安装了 rustc-x86_64-pc-windows-msvc,就会同步安装 rust-std-x86_64-pc-windows-msvc
rust-docsRust 文档的本地版本(静态 HTML 格式),位于 .rustup/toolchains/发行版/share/doc/rust 目录中
  1. 使用命令 rustup doc 就可以在浏览器中打开
  2. 这里的文档主要是 https://github.com/rust-lang/rust 这个仓库中的 src/doc(现在,很多文档被移到了子仓库维护)下的文档,很多独立工具的文档不在其中
rust-analyzerrust-analyzerRust 语言服务器协议的实现,用于配合 VS Code、Emacs 等实现 Rust 语言的编辑功能。
  1. 这个工具通常会以编辑器插件的形式提供,并不会单独安装
  2. 官方也不建议单独安装,它会覆盖编辑器插件中集成的 rust-analyzer,而导致出错
clippycargo-clippyclippy-driver代码检查工具
miriMiri 是一个实验性的 Rust 解释器,可用于检查未定义的行为
  1. 目前不提供给 Stable 通道
rust-srcRust 标准库源代码的本地副本,位于 .rustup/toolchains/发行版/lib/rustlib/src 目录中,某些工具,例如 rust-analyzer 会使用源码来提供一些功能
  1. https://github.com/rust-lang/rust 这个仓库中的 library 目录中的内容
  2. 此外还包括 LLVM 的 libunwind 的源码
  3. 默认不会安装该组件,需要使用 rustup component add rust-src 来手动安装
rust-mingwld它包含一个用于构建在 x86_64-pc-windows-gnu 平台上的链接器和平台库,位于 .rustup/toolchains/发行版/lib/rustlib/x86_64-pc-windows-gnu 目录中
  1. 默认安装 x86_64-pc-windows-gnu 后就包含了 rust-mingw
llvm-toolsLLVM 官方的那些工具包含 LLVM 工具的集合,位于 .rustup/toolchains/发行版/lib/rustlib/x86_64-pc-windows-gnu 目录中
rustc-dev此组件将编译器包含为库,用于开发 Rust 的编译器,一般用不到
rlsrlsRLS 是一种语言服务器,已被废弃,并被 rust-analyzer 所取代。
rust-analysisRLS 使用的标准库的元数据
  1. 有些组件是区分不同的架构平台的,全名是 组件名-编译工具链名,例如,cargo-x86_64-pc-windows-gnu,通过 rustup component list 可以看到所有的组件及当前安装情况
    在这里插入图片描述
  2. 使用 rustup component xxx 相关命令来查看、添加或者删除组件,当我们使用 rustup component add 上表中的组件名 时,就会从 Rust 官方网站下载对应的组件放到 .rustup/toolchains/发行版/ 中。
    在这里插入图片描述
  3. 组件并不是提供到所有发布通道的,有些通道没有某些组件。例如,上面的 miri 只提供给 Nightly 通道

Profiles

  Profiles 代表了要安装的 Rust 开发辅助工具的集合,不同的 Profiles 包含的组件不同,共有 minimal、default、complete 三种 profile 可选。如果选了 minimal 后续也可以使用 rustup component add xxx 命令手动安装需要的工具。

  1. minimal 包含 rustc、rust-std、cargo;default 则在 minimal 基础上添加了 rust-docs、rustfmt、clippy,是官方推荐的;complete 包含所有组件,官方强烈不推荐使用,因为会出错
  2. 使用 rustup set profile minimal 可以更改默认的 Profile
  3. 使用 rustup install --profile <name> 可以在安装工具链时指定 Profile

版本发布

  随着对 Rust 了解的逐渐深入,就会发现 Rust 的发布有版本(Version)、发行版(Release)、版次(Edition)这三个不同维度概念,对于初学者来说比较难以理解这三者的具体区别。官方也没有一个简单明了的解释来说明三者之间的具体含义或区别。
在这里插入图片描述

版本

  版本这个概念对应于 Version 这个词,Rust 采用语义化版本号来表示不同的版本,格式为 x.y.z,例如,Rust 1.79.0。这个语义化版本号即是 Rust 语言的版本号又同时是 Rust 工具链的版本号,我们通常说使用特定版本的 Rust,实际上就是指的使用特定版本的 Rust 工具链。
在这里插入图片描述

  1. Rust 的工具链总是与 Rust 语言一同发布,通过 https://github.com/rust-lang/rust 这个源码仓库来维护,他们的版本号都是语义化版本号
  2. Rust 中的软件包也使用语义化版本号,其项目管理工具 Cargo 以语义化版本号的相关规则来判断包版本兼容,详见后文说明

发行版

  发行版这个概念指的是 Rust 版本(Version)的交付方式。Rust 版本(Version)的交付采用了 Nightly、Beta、Stable 三个不同的 Channels 来进行发布。采用不同 Channels 这种交付模式被称为 Release Train Model,这是一种需求收集、分析、决策、发布、问题反馈的产品开发模型。
在这里插入图片描述
  每一个 Rust 版本(Version)都会依次经过这三个 Channels 而进行发布。Nightly 是正在开发的版本、每晚自动构建、自动发布;Beta 是测试版本,每 6 周从 Nightly 生成一次,包含新特性;Stable 是稳定版本,每 6 周从 Beta 生成一次。如下是目前各个 Channel 中发布的 Rust 版本(Version):
在这里插入图片描述

  • Rust 语言与编译工具链是密切相关的,因此,发行版通常是指的编译工具(及相关工具)的交付方式

  • 发布情况可以从 Rust Forge 上获取

  • 用户通过官方提供的 rustup 工具就可以非常方便的安装及使用不同的发行版

  • Rust 的很多特性只在特定的 Channels 中发布,例如,当前 unstable 的特性,只提供给 Nightly 通道!

版次

  版次这个概念对应官方的 Edition 的概念,直接使用一个年份来表示,例如,Rust 2021 Edition,中文翻译为版次主要是为了与版本(Version)来进行区分。这个概念侧重于 Rust 这门编程语言的版本,就类似于 C99、C++11、C++17 等标准,不同的版次之间往往会出现很多不兼容的特性!

  • 每个 crate 在其 Cargo.toml 文件中使用 edition = xxx 指定其使用的版次
    在这里插入图片描述
  • 版次不是周期性发布的,只有 Rust 项目组认为确有必要时才会发布。目前可用的版次是 2015、2018、2021、2024 这四个

开发环境

  我们说使用一门编程语言,一方面是根据语法编写源代码,另一方面就是使用各种工具处理代码。因此,要使用 Rust 语言开发,首先就要下载安装官方提供的各种工具来搭建 Rust 的开发环境。

  对于使用 Rust 进行开发,官方并没有一个统一的 IDE,用户可以任意选择。不过,官方推荐了一些常用代码编辑器,这些编辑器通过搭配官方提供的开发辅助工具中的 rust-analyzer 就可以完美实现 Rust 代码的开发。
在这里插入图片描述

工具安装

  代码编辑器(推荐是 VSCode)使用者根据自己的喜好选择安装即可,而开发辅助工具及编译工具链则需要单独进行安装。Rust 官方提供了预编译好的工具可执行程序,并通过名为 rustup 的工具统一安装及管理。

  打开 Rust 的官方网站会自动侦测我们使用的操作系统,并给出对应的安装方法。对于 Windows 系统,我们需要下载运行官网的 rustup-init.exe 来安装 Rust 相关工具,而对于 Linux 或 macOS 系统,则需要在自己系统命令终端中使用命令 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 来进行安装。
在这里插入图片描述
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 实际上就是下载名为 rustup-init.sh 的 Shell 脚本并执行,而 rustup-init.sh 脚本中就会下载 rustup-init 可执行程序来进行安装,因此,不同的平台下的安装过程基本一致!
在这里插入图片描述

  1. 实际上,rustup-init 本身就是 rustup 改了一个名字,rustup 实现了根据自身名字的不同来执行不同的功能,详见后文 rustup 章节!

  2. rustup-init 总是默认下载安装最新版。下载源位于国外,因此下载速度会很慢,偶尔还会下载失败,多试几次即可!此外,还可以通过定义如下环境变量(例如,在 Linux 的 ~/.bashrc 中增加)来将 Rustup 切换为国内的镜像源

    export RUSTUP_DIST_SERVER="https://rsproxy.cn" 
    export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
    
  3. 使用 MSVC 作为 ABI 的工具链(仅限于 Windows 系统)时,需要安装 Visual Studio 或 Visual C++ Build Tools,如果当前系统没有安装,安装过程中会提示下载;使用 GNU 作为 ABI 的工具链(无论是 Windows 还是类 Unix 系统)时则需要安装 GCC。

    • 根本原因是 Rust 编译工具链需要使用他们提供的链接器,详见博文 Rust 之三 编译工具链、构建过程 中的介绍

    • Windows 系统

      • MSVC:现在 Visual Studio 是通过 Visual Studio Installer 在线组件化安装,对于 Rust,需要 MSVC 和 Windows SDK,例如:
        • MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)
        • Windows 11 SDK (10.0.22621.0)
        • 注意,由于 Visual Studio 默认会使用本地编码(中文就是 GBK),可能会导致 Rust 会出现乱码,通常通过切换语言就可以解决!
      • GCC:通常是采用 MinGW-w64 或类似于 MSYS2、Cygwin 这类包含 MinGW-w64 环境。不推荐,会出现一些问题需要自行解决!
    • 类 Unix 系统

      • 直接使用系统命令安装系统官方提供的 GCC 工具链即可
  4. host triple 就是我们要安装的编译工具链,格式基本类似于 GNU 的 <arch>-<vendor>-<sys>-<abi>。对于 Windows 平台,可以用 MSVC 或 GNU 作为 ABI 的工具链,默认采用 MSVC 版,而对于类 Unix 系统,则只有 GNU 作为 ABI 的工具链。

    关于编译工具链,参见博文 Rust 之三 编译工具链、构建过程 中的详细介绍

  5. default toolchain 这个就对应编译工具链的 Stable、Beta、Nightly 三个不同 Channel 的发行版,默认安装 Stable 通道中最新版本的发行版。实际上这里也可以指定一个版本号,例如 1.79,来安装特定版本的!

  6. profile 就是上文 Profiles 章节介绍的

安装目录

  通过上面的安装过程可以看到,开发辅助工具及编译工具链被安装到了当前用户目录下的 .cargo.rustup 目录中。其中,.cargo 目录中包含了 Rust 所有开发工具的统一接口,还包括我们下载的各种第三方包;而 .rustup 目录中则包含了特定于平台的编译工具链以及相关辅助工具!

detected conflict

  有时候,我们在使用 Rust 时会收到如下所示的错误 error: failed to install component: 'rustc-x86_64-unknown-linux-gnu', detected conflict: 'lib/rustlib/x86_64-unknown-linux-gnu/bin/llc',目前需要等等官方解决,详见 https://github.com/rust-lang/rustup/issues/2417!

rustup

  rustup 是 Rust 官方提供的相关实用工具以及编译工具链的安装及管理器,使用 rustup 这个工具就可以自动为我们下载安装官方的 Rust 各工具的发行版,并且可以在不同的发行版之间自由切换。
在这里插入图片描述
  rustup 是一个命令行工具,对应的可执行程序名为 rustup,详细的使用方法见上图中的命令行参数说明即可。rustup 本身就是代理的原型,它自身没有代理!

源码

  rustup 的源码仓库为 https://github.com/rust-lang/rustup,源码本身就是一个 Rust 项目工程,因此,我们可以使用 cargo build 命令一键编译出名为 rustup-init 可执行程序,这个是 rustup-init 实际上就是 rustup,详见下面的说明。
在这里插入图片描述

  1. rustup 源码中实现了根据名字的不同而实现不一样的功能,.cargo/bin 中的各个工具以及我们安装使用的 rustup-init 实际上都是它改成了不同名字。 详见 src\bin\rustup-init.rs 中函数 main()run_rustup()run_rustup_inner() 的内容
    在这里插入图片描述

  2. 对于类 Unix 系统,官方推荐的 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 安装方法实际上就是下载并执行源码中的 rustup-init.sh 这个脚本

  3. rustup 是 multirust 的继承者。Rustup 最初是 multiust-rs,由 Diggory Blake 将 multirust 从 shell 脚本改写为 Rust,现在由 Rust 项目维护。

文档

  1. 官方在线文档有如下两个
    • The rustup book!
    • The Rustup developer guide
  2. 文档的源码位于 rustup 源码的 doc 目录下,使用的是 mdBook 文档系统,详细介绍参见后文的 mdBook 章节的介绍
    在这里插入图片描述

配置

  rustuprustup-init) 会自动读取 CARGO_HOMERUSTUP_HOME 这两个环境变量的值,其中,CARGO_HOME 指定了 Cargo 相关工具以及缓存的存放位置, 而 RUSTUP_HOME 则指定了编译工具链的位置。

  1. RUSTUP_DIST_SERVER(之前叫 RUSTUP_DIST_ROOT,现已弃用 )指定了编译工具链的下载的地址,默认是 https://static.rust-lang.org
  2. RUSTUP_UPDATE_ROOT 指定了 rustup 自更新的地址,默认值是 https://static.rust-lang.org/rustup
  3. 其他配置项见 https://rust-lang.github.io/rustup/environment-variables.html

Cargo

  Cargo 是 Rust 的包管理器,可以用于依赖包的下载、编译、更新、分发等操作。同时, Cargo 还是一个命令行项目管理工具,它有一套自己的项目结构,可以帮助我们自动调用编译工具链来编译 Rust 项目源码。
在这里插入图片描述
  cargo 是一个命令行工具,对应的可执行程序名为 cargo,详细的使用方法见上图中的命令行参数说明即可。当我们使用时实际上是通过 .cargo/bin/cargo 这个代理来调用 .rustup/toolchains/发行版/bin/cargo 这个真正的可执行程序。
在这里插入图片描述

  1. Cargo 默认的工作目录为 $HOME/.cargo,其中的目录说明如下:
    在这里插入图片描述

    • bin:包含了通过 cargo install(只有拥有二进制目标文件的包能够被安装,并会被安装到 $HOME/.cargo/bin 中) 或 rustup 下载的包编译出的可执行文件。可以(默认)将该目录加入到 $PATH 环境变量中,以实现对这些可执行文件的直接访问
    • registry:这个是 Cargo 下周的各种 Crate 的缓存目录,包含了注册中心(例如 crates.io)的元数据和 Packages
      • index: 包含了注册中心中所有可用包的元数据( 版本、依赖等 )
      • cache: 保存了已下载的依赖,这些依赖包以 gzip 的压缩档案形式保存,后缀名为 .crate
      • src: 若一个已下载的 .crate 被一个 package 所需要,该档案会被解压缩到此目录下,最终 rustc 可以在其中找到所需的 .rs 文件
  2. Cargo 管理的项目的基本单位被称为 Package。一个 Package 中至少包含一个 Crate;一个 Package 中最多只能包含一个库 Library Crate;一个 Package 中可以包含任意多个 Binary Crate,详见之后的博文 Rust 之二 项目管理、文档规范、编码规范。

  3. Cargo 内置的子命令只有 buildcheckdocruntestremove 等几个,当输入其他子命令时,它支持自动查找 cargo-xxx 的其他可执行文件,详见后文源码章节的说明!

  4. 绝大多数情况下,我们都是使用 cargo 命令来编译项目,而不是直接使用 rustc
    在这里插入图片描述

cargo-binutils

  cargo-binutils 是由 Rust 官方的嵌入式工作组(Rust on Embedded Devices Working Group)中的工具组(Embedded WG Tools team)维护的一个非官方项目,这个项目可以为我们的 cargo 命令增加一些子命令,使用这些子命令可以直接调用指定编译工具链对应的 LLVM 的相关工具。
在这里插入图片描述

安装

  1. cargo install cargo-binutils
  2. rustup component add llvm-tools

示例

  • cargo objcopy 用于将 ELF 转换为 BIN
  • cargo nm 输出符号表
  • cargo objdump 反汇编

cargo build

  cargo build 会编译我们的项目代码,结果会被放入项目根目录下的 target 文件夹中,target 目录的结构取决于是否使用 --target 标志为特定的平台构建。target 的位置可以通过设置 CARGO_TARGET_DIR 环境变量、build.target-dir 配置项以及 --target-dir 命令行参数这三种方式来更改。

  1. cargo build --verbose 可以看到调用 rustc 的详细参数
  2. 编译库时,Cargo 会自动使用 rustc--crate-type lib 选项,进而生成 .rlib 的库文件;编译可执行程序时,Cargo 会自动使用 rustc--crate-type bin,进而生成可执行文件
  3. 对于每个 Crate 的编译,Cargo 都会为 rustc 指定 --extern 选项,给出当前 crate 将使用的每个库的文件名,Rust 会将代码静态链接到最终的可执行文件中

不使用 --target

  若不使用 --target 标志,则 Cargo 会根据宿主机架构进行构建,构建结果会放入项目根目录下的 target 目录中,target 下每个子目录中包含了相应的发布配置 profile 的构建结果,例如 release、debug 是自带的 profile,前者往往用于生产环境,因为会做大量的性能优化,而后者则用于开发环境,此时的编译效率和报错信息是最好的。

目录描述
target/debug/包含了 dev profile 的构建输出(cargo build 或 cargo build --debug)
target/release/release profile 的构建输出,cargo build --release
target/foo/自定义 foo profile 的构建输出,cargo build --profile=foo

  除此之外我们还可以定义自己想要的 profile ,例如用于测试环境的 profile: test,用于预发环境的 profile :pre-prod 等。出于历史原因:

  • dev 和 test profile 的构建结果都存放在 debug 目录下
  • release 和 bench profile 则存放在 release 目录下
  • 用户定义的 profile 存在同名的目录下

使用 --target

  当使用 --target XXX 为特定的平台编译后,输出会放在 target/XXX/ 目录下:

target 子目录说明

  在 profile 文件夹中(例如 debug 或 release)包含编译后的最终成果:

目录描述
target/debug/包含编译后的输出,例如二进制可执行文件、库对象( library target )
target/debug/examples/包含示例对象( example target )

还有一些命令会在 target 下生成自己的独立目录:

目录描述
target/doc/包含通过 cargo doc 生成的文档
target/package/包含 cargo package 或 cargo publish 生成的输出

Cargo 还会创建几个用于构建过程的其它类型目录,它们的目录结构只应该被 Cargo 自身使用,因此可能会在未来发生变化:

目录描述
target/debug/deps依赖和其它输出成果
target/debug/incrementalrustc 增量编译的输出,该缓存可以用于提升后续的编译速度
target/debug/build/构建脚本的输出

源码

  Cargo 的源码仓库为 https://github.com/rust-lang/cargo,源码本身就是一个 Rust 项目工程,因此,我们可以使用 cargo build 命令一键编译出名为 cargo 可执行程序。
在这里插入图片描述
  Cargo 会自动查找 cargo- 开头的其他可执行文件,并把他们作为子命令来使用!
在这里插入图片描述

文档

  1. 官方在线文档
    • The Cargo Book
  2. 文档的源码位于 Cargo 源码的 /src/doc 目录下,使用的是 mdBook 文档系统,详细介绍参见后文的 mdBook 章节的介绍
    在这里插入图片描述

配置

  Cargo 在工作时会自动读取 Windows 平台下的 %USERPROFILE%\.cargo\config.toml 或者类 Unix 系统下的 $HOME/.cargo/config.toml 或者当前项目目录下的 .cargo/config.toml 中的配置信息(在 cargo 1.38 及以前的配置版本使用文件名 config)。其中,当前项目目录下的 .cargo/config.toml 优先级高于系统用户目录下的配置文件!config.toml 中的内容最常用的就是更改软件包的镜像源地址。

  1. 在 crates.io 之外添加新的注册服务,配置如下:

    [registries]
    ustc = { index = "https://mirrors.ustc.edu.cn/crates.io-index/" }
    

    对于这种方式,我们的项目的 Cargo.toml 中的依赖包引入方式也得对应的改

    [dependencies]
    time = {  registry = "ustc" }
    
  2. 直接使用新注册服务来替代默认的 crates.io,配置如下

    [source.crates-io]
    replace-with = 'ustc'
    [source.ustc]
    registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
    

    示例:

    [source.crates-io] 
    registry = "https://github.com/rust-lang/crates.io-index" 
    replace-with = "ustc" # 或 rustcc、sjtu、tuna  
    # 根据 replace-with 配置的镜像源,以下只需配置一个对应的源即可 
    # 中国科大 
    [source.ustc] 
    registry = "git://mirrors.ustc.edu.cn/crates.io-index"  
    # rustcc 社区 
    [source.rustcc] 
    registry = "https://code.aliyun.com/rustcc/crates.io-index.git"  
    # 上海交通大学 
    [source.sjtu] 
    registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"  
    # 清华大学 
    [source.tuna] 
    registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
    
  3. CARGO_TARGET_DIR 定义了构建输出目录,默认是 target

  4. CARGO_HOME 这个环境变量定义了 Cargo 默认所在的目录,其中包含了 Cargo 可执行程序、配置文件、缓存文件等等,我们通过修改这个环境变量就可以重定位 Cargo 的位置。

    • Windows 平台下默认值是 %USERPROFILE%\.cargo;Unix 类系统下默认值是 $HOME/.cargo

    • 当我们使用 Cargo 构建项目时,下载的各种 crates 就位于 .cargo/registry 目录中

Clippy

  Clippy 是Rust 官方开发的一个基于 LLVM 的 Rust 代码检测及优化工具(类似于 PC-lint 这类工具),它可以自动检测 Rust 代码中的潜在问题,并提供相应的建议。Clippy 使用 Lint 规则来检查代码,这些规则基于 Rust 的编译器插件系统。
在这里插入图片描述
  cargo-clippy 是一个命令行工具,对应的可执程序为 cargo-clippy。当我们使用时实际上是通过 .cargo/bin/cargo-clippy 这个代理来调用 .rustup/toolchains/发行版/bin/cargo-clippy 这个真正的可执行程序。
在这里插入图片描述

cargo clippy

  通常,cargo-clippy 是作为 cargo 命令的一个子命令 cargo clippy 来间接使用
在这里插入图片描述

clippy-driver

  Clippy 可以抛开 Cargo 来独立使用,此时需要使用 clippy-driver 命令,其参数则需要与 rustc 的参数相同,例如 clippy-driver --edition 2018 -Cpanic=abort foo.rs
在这里插入图片描述

配置

  默认情况下,cargo-clippy 会自动查找名为 clippy.toml.clippy.toml 的文件,搜索的位置优先级由高到低为 CLIPPY_CONF_DIRCARGO_MANIFEST_DIR、当前项目目录,并执行其中的规则。

  1. 除了配置文件中存放的部分 Lint 规则外,还可以直接在 cargo-clippy 的命令行中指定一些规则。

  2. 目前,Clippy 中包含了超过 700 条 lints,这些 lints 被划分为了多个类别,每个类别都对应一个默认的 lint level。在 rustc 中,Lint 被分为了 allow、warn、force-warn、deny、forbid 这 5 level。
    在这里插入图片描述

  3. Cargo.toml 中的 [lints.clippy] 中也可以指定一些规则

  4. 在源代码中也可以使用特定的属性,例如 #![allow(clippy::all)] 来指定规则

源码

  Clippy 的源码仓库为 https://github.com/rust-lang/rust-clippy,源码本身就是一个 Rust 项目工程,因此,我们可以使用 cargo build 命令一键编译出名为 cargo-clippyclippy-driver 的可执行程序。
在这里插入图片描述

文档

  1. 官方文档 Clippy Documentation

  2. 文档的源码位于 Clippy 源码的 book 目录下,使用的是 mdBook 文档系统,详细介绍参见后文的 mdBook 章节的介绍
    在这里插入图片描述

Rustfmt

  Rustfmt 是 Rust 官方提供的格式化 Rust 代码的工具(类似于 LLVM 的 clang-format 这类工具),它根据一些预定义的规则(括号的使用、缩进的级别、空格的添加等)来自动将 Rust 代码格式化为统一的风格。
在这里插入图片描述
  rustfmt 是一个命令行工具,对应的可执程序为 rustfmt,使用命令 rustfmt [options] <file>... 来对指定的源码文件来进行格式化。当我们使用时实际上是通过 .cargo/bin/rustfmt 这个代理来调用 .rustup/toolchains/发行版/bin/rustfmt 这个真正的可执行程序。
请添加图片描述

cargo fmt

  通常 rustfmt 会被作为 cargo 命令的一个子命令 cargo fmt 来间接使用,完整格式是 cargo fmt [OPTIONS] [-- <rustfmt_options>...],其中的 [-- <rustfmt_options>...] 会直接传递给 rustfmt 来进行使用,因此它的取值就是 rustfmt 的选项。
在这里插入图片描述

cargo-fmt

  此外,rustfmt 默认还会提供一个名为 cargo-fmt 的可执行程序,这个工具的作用于 cargo fmt 类似,不过它不依赖于 Cargo 这个工具进而实现类似的功能,因此,在不用 Cargo 时,我们可以直接使用 cargo-fmt 来一键格式化整个项目的源文件。
在这里插入图片描述

配置

  在默认情况下,rustfmt 会自动读取当前项目各级目录下的 rustfmt.toml.rustfmt.toml 文件,并根据其中的规则来进行格式化配置文件所在的目录的代码。如果子目录下没有配置文件,但是它的父级目录有,则根据父级目录的配置文件格式化。

  1. 如果项目目录下不存在 rustfmt.toml.rustfmt.toml,则会尝试读取用户目录
  2. 如果用户目录下也没有,则读取 rustfmt 全局配置目录下的全局配置文件
    在这里插入图片描述
  3. 配置文件中的各种规则直接查看源码中的 Configurations.md 或者使用在线 https://rust-lang.github.io/rustfmt/ 版本,两者是一样的!

源码

  Rustfmt 的源码仓库为 https://github.com/rust-lang/rustfmt,源码本身就是一个 Rust 项目工程,因此,我们可以使用 cargo build 命令一键编译出名为 cargo-fmtrustfmt 的可执行程序。
在这里插入图片描述

文档

  目前,Rustfmt 的文档就是源码里的 Configurations.md,源码目录的 docs 中的 index.thml 中就是通过 JavaScript 调用的 Configurations.md 的内容!

rust-analyzer

  rust-analyzer 是 Rust 编程语言的语言服务器协议的实现。它为许多代码编辑器(VS Code、 Emacs 和 Vim)提供了代码完成、语法高亮和转到定义等特性。它也是一个命令行工具,不过,我们通常不会直接使用它,而是由代码编辑器插件来帮我们调用。

  1. 由于 rust-analyzer 通常不会由我们直接使用,所以,默认安装 Rust 后没有 rust-analyzer
    在这里插入图片描述

  2. 实际上就是一个模块化编译器前端或者说一个动态分析库,通过 LSP(Language Server Protocol)与 VS Code、 Emacs 和 Vim 等通信

  3. rust-analyzer 依赖 Rust 标准库的源码,通常需要手动执行 rustup component add rust-src 来安装,安装后的位置为 .rustup\toolchains\toolchain_name\lib\rustlib\src\rust

  4. rust-analyzer 提供的功能都是通过调用其他 Rust 工具来实现的,例如,代码格式就会调用 rustfmt

源码

  rust-analyzer 的源码仓库为 https://github.com/rust-lang/rust-analyzer,源码本身就是一个 Rust 项目工程,因此,我们可以使用 cargo build 命令一键编译出名为 rust-analyzerrust-analyzer-proc-macro-srv 的可执行程序。
在这里插入图片描述

文档

  官方在线文档 。

  1. 官方在线文档
    • https://rust-analyzer.github.io/manual.html
  2. 文档的源码位于 rust-analyzer 源码的 docs 目录下,,使用的是 mdBook 文档系统,详细介绍参见后文的 mdBook 章节的介绍

配置

  配置项众多,参见 https://rust-analyzer.github.io/manual.html#configuration 即可。

mdBook

  mdBook 是使用 Markdown 创建文档的命令行工具。它是创建产品或 API 文档、教程、课程材料或任何需要简洁、易于导航和可定制的演示文稿的理想工具。Rust 提供的绝大多数文档都是使用 mdBook 来构建的!
在这里插入图片描述

  1. 默认安装 Rust 后比不会安装 mdbook,我们需要使用 cargo install mdbook 手动进行安装,mdbook 可执行文件会被放到 .cargo/bin 目录中

  2. 使用 mdbook init xxx 创建文档目录,自动生成如下所示的目录结构
    在这里插入图片描述

    • book.toml 是配置文件,可以配置每篇文章最上面统一标题、路径、作者等信息

    • 新增的 Markdown文章都要放到 src 目录下,可以自行创建子目录来进行分类存放

    • SUMMARY.md 是所有文章的目录,新增的 Markdown文章都需要在这里面配置下

    • book 文件夹用于存放 mdBook 构建后产生的 HTML 的文档

  3. 在文档目录中,执行 mdbook build 就可以一键生成 HTML 格式的静态网页文档,默认存到当前目录的 book 文件夹中

  4. mdbook serve 启动本地 Web 服务器,我们可以直接在浏览器中以 localhost 进行预览

源码

  mdBook 的源码仓库为 https://github.com/rust-lang/mdBook,源码本身就是一个 Rust 项目工程,因此,我们可以使用 cargo build 命令一键编译出名为 mdbook 的可执行程序。
在这里插入图片描述

文档

  1. 官方在线文档
    • mdBook Documentation!
  2. 文档的源码位于 mdBook 源码的 guide 目录下,本身也是使用的 mdBook 文档系统。首先安装 cargo install mbook 或者自己构建后,在 doc\guide中执行 mbook build 或者在 mbook build 指定路径 就可以构建出上面的官方在线文档
    在这里插入图片描述

rustdoc

  rustdoc 是 Rust 官方提供的随附编译工具链发布的文档处理工具,这个工具主要是用来自动收集当前项目源码文件中的各种注释来生成对应文档,它接受一个 crate root 文件或者一个 Markdown 文件作为参数,然后生成 HTML,CSS 和 JavaScript 文件等称为一套以静态网页为主的文档。
在这里插入图片描述
  rustdoc 是一个命令行工具,对应的可执程序为 rustdoc,使用命令 rustfmt [options] <input> 自动收集源码中的注释形成文档。当我们使用时实际上是通过 .cargo/bin/rustdoc 这个代理来调用 .rustup/toolchains/发行版/bin/rustdoc 这个真正的可执行程序。
在这里插入图片描述

  1. rustdoc 以 crate root 文件为入口自动遍历所以使用到的源码文件,不用我们手动指定所有源码文件。
  2. 默认的文档名字是 Crate 的名字,可以使用 --crate-name xxx 来进行更改
  3. 文档将存放到 target\doc 目录下,每个 Crate 一个子目录,他们之间会互相引用

cargo doc

  通常 rustdoc 会被作为 cargo 命令的一个子命令 cargo doc 来间接使用,完整格式是 cargo doc [OPTIONS]。这个命令需要在我们的 Package 目录下执行,Cargo 将自动查找所有源代码文件(包括我们依赖的 Crate 的源码文件)。
在这里插入图片描述

  1. 使用 cargo doc --verbose 可以看到调用 rustdoc 的详细参数
    在这里插入图片描述

  2. cargo doc 目前不支持独立的 Markdown 文件

  3. cargo doc 命令不止处理我们自己的源码文件,还会处理依赖的 Crate 的源码文件,进而形成一整套的文档。运行 cargo doc --open 命令来构建所有本地依赖项提供的文档,并在浏览器中打开,这样就方便了我们查找需要的接口

源码

  rustdoc 稍微有点特殊,它是作为 Rust 的编译工具链中的一个标准组件来发布的。因此,它没有一个单独的源码仓库,而是在 Rust 编译工具链的仓库 https://github.com/rust-lang/rust 中的一个部分
在这里插入图片描述

文档

  • 官方文档 The rustdoc book

  • 文档的源码位于 Rust 源码的 src\doc\rustdoc 目录下,可以使用命令 x.py doc src/doc/rustdoc 来构建,使用的是 mdBook 文档系统,详细介绍参见后文的 mdBook 章节的介绍

文档注释

  rustdoc 会提取源码文件中特定格式的注释(官方称为文档注释)来生成文档,rustdoc 规定了用于生成的文档的注释必须以 /// 或者 //! 开头,并且注释的内容主要使用 Markdown 语法来进行编写。

  1. /// 用于放在函数、结构体、变量等代码前面以对代码进行注释,称为 outer documentation,示例如下:
    在这里插入图片描述
  2. //! 用于放到一个源码文件的开头给一个源码文件注释,称为 inner documentation。示例如下:
    在这里插入图片描述
    1. 当它位于 root crate 文件时,那么它就是文档主页的注释
    2. 其最后面需要加一个空行
  3. 可以在自己的 src/lib.rsmain.rs 的开头添加 #![warn(missing_docs)],而如果是一个要共享的库则可添加 #![deny(missing_docs)]
  4. 使用 #[doc(hidden)] 可以屏蔽将之后的内容提取到文档中

参考

  1. https://cloud.tencent.com/developer/article/1477262
  2. https://blog.csdn.net/fj_Author/article/details/132594546
  3. https://www.andy-pearce.com/blog/posts/2023/May/uncovering-rust-build-and-packaging/
  4. https://www.prodyna.com/insights/rust-apps

相关文章:

Rust 之一 基本环境搭建、各组件工具的文档、源码、配置

概述 Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全&#xff0c;使用其特有的所有权机制&#xff0c;而无需传统的垃圾收集器。Rust 不强制执行编程范式&#xff0c;但受到函数式编程思想的影响。 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年…...

详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本

nbconvert 是 Jupyter 提供的一个非常强大的工具&#xff0c;允许用户将 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;转换成多种格式&#xff0c;包括 Python 脚本&#xff08;.py&#xff09;、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert&#xff0c;也…...

C语言之预处理

预处理 一.头文件的包含1.1头文件的作用1.2包含头文件的方式- 包含标准库头文件- 包含用户自定义头文件 1.3嵌套文件包含 二.条件编译2.1条件编译的作用2.2条件编译的指令 三.预定义符号四.define4.1define定义常量4.2#define定义宏4.2.1定义宏时常见错误 4.3宏替换的规则4.4带…...

AcWing--869.试除法求约数

题目&#xff1a; 给定 n 个正整数 ai&#xff0c;对于每个整数 ai&#xff0c;请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 ai。 输出格式 输出共 n 行&#xff0c;其中第 i 行输出第 i 个整数 ai 的所有…...

【HeadFirst系列之HeadFirstJava】第16天之深入解析 Java 集合与泛型:高效管理数据的终极指南!(含代码实战)

Java 集合与泛型全解析&#xff1a;数据结构的奥秘&#xff08;基于 Head First Java 第 16 章&#xff09; 在 Java 开发中&#xff0c;我们经常需要存储和操作大量数据。如何高效地存储、检索和操作数据&#xff1f;如何避免数组的局限性&#xff1f;Java 集合框架&#xff…...

【从零开始学习计算机科学】操作系统(七)文件管理

【从零开始学习计算机科学】操作系统(七)文件管理 文件管理文件的逻辑结构文件的读写方式文件的物理结构与组织文件目录空闲块管理文件的共享文件的权限控制与保护文件系统的其他功能文件管理 文件管理主要涉及文件的逻辑组织和物理组织,目录的结构和管理。所谓文件管理,就…...

Stable Diffusion F.1模型全面解析

一、引言&#xff1a;生成式AI的变革与SD模型的演进 生成式AI的崛起 扩散模型&#xff08;Diffusion Model&#xff09;成为图像生成领域的主流范式&#xff0c;其通过逐步去噪过程实现高保真图像合成。Stable Diffusion&#xff08;SD&#xff09;作为开源社区标杆&#xff0c…...

基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

上海利氪科技-再次续订MappingSpace

2024年6月&#xff0c;智能底盘系统方案商利氪科技完成C轮融资&#xff0c;本轮融资规模超10亿元人民币。 成立于2021年&#xff0c;利氪科技短短三年时间就已获得近20亿元融资。 利氪科技是领先的智能线控底盘系统方案商。公司聚焦新能源汽车和自动驾驶核心领域&#xff0c;依…...

go注册rpc接口

1.定义proto文件&#xff1a; syntax "proto3";package pb;service Service { rpc RPC (Request) returns (Reply) {} }message Request {string Action 1;int64 TraceID 2;string Payload 3; }message Reply {int32 Code 1;int64 TraceID 2;string Pa…...

如何在Spring Boot中校验用户上传的图片文件的两种方法

在现代应用中&#xff0c;用户上传图片是一个常见的需求。无论是社交平台、电子商务网站还是任何需要用户交互的应用&#xff0c;图片上传功能都显得尤为重要。但合理地校验用户上传的图片文件是必不可少的步骤&#xff0c;避免不合规的文件影响系统的稳定性和安全性。本文将介…...

如何将一个项目推送到gitlab

1. 初始化本地项目为 Git 仓库 若本地项目还不是 Git 仓库&#xff0c;要先将其初始化为 Git 仓库。在项目根目录下打开终端&#xff0c;执行如下命令&#xff1a; git init 2. 添加文件到暂存区 使用 git add 命令把项目中的文件添加到暂存区。若要添加所有文件&#xff0…...

【JavaWeb学习Day24】

Web前端实战 Vue工程化 Vue是一款用于构建用户界面的渐进式的JavaScript框架。&#xff08;官方&#xff1a;https://cn.vuejs.org&#xff09; Vue项目工程化&#xff1a;在企业级的前端项目开发中&#xff0c;把前端开发所需求的工具、技术、流程、经验等进行规范、标准化。…...

Scratch034豌豆发射(下)

知识回顾 1、克隆体点击角色的判断 2、使用克隆体时“停止该角色其他脚本”积木的作用范围。 效果演示 提示:这里可以添加本文要记录的大概内容每隔一段时间,舞台右侧就会出现多个除草机向左移动 点击不同位置的豌豆射手,可以发射豌豆攻击对应位置的除草机 除草机被豌豆击中…...

nacos下载及安装

下载官方最新稳定版 github下载较慢&#xff0c;推荐下面的下载链接 Nacos Server 下载 | Nacos 官网 点击下载和试用下载最新稳定版 Nacos Server 下载 | Nacos 官网 配置检查&#xff08;可选&#xff09; 默认情况下&#xff0c;Nacos 使用内置的 Derby 数据库&#x…...

javase集合框架Map篇

一、常见的Map的实现 有HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap。 二、HashMap和Hashtable 的区别 HashMap&#xff1a;底层是基于数组链表&#xff0c;非线程安全的&#xff0c;默认容量是16、允许有空的健和值。 Hashtable&#xff1a;基于哈希表…...

【RAGFlow】windows本地pycharm运行

原因 由于官方只提供了docker部署&#xff0c;基于开源代码需要实现自己内部得逻辑&#xff0c;所以需要本地pycharm能访问&#xff0c;且docker运行依赖得其余组件&#xff0c;均需要使用开发服务器得配置。 修改过程 安装python 项目依赖于Python 版本&#xff1a;>3.1…...

STM32初始安装

前言 很多人刚买来STM32就迫不及待地想要用它来写程序&#xff0c;看见STM32开发版和ST-Link上有几个插口就直接连接&#xff0c;结果就像我一样一不小心就导致ST -Link烧坏了&#x1f602; 所以本篇博客将做最基础的但是对于小白来说最重要的教学&#xff0c;STM32的线路连接…...

数据库系统概论(二)数据模型

数据库系统概论&#xff08;二&#xff09;数据模型 数据库系统概论&#xff08;二&#xff09;数据模型前言一、数据建模二、概念模型三、数据模型的三要素四、层次模型五、网状模型六、关系模型 总结&#xff08;核心概念速记&#xff09;&#xff1a; 数据库系统概论&#x…...

深入理解C语言链表:数据结构的基石

在C语言的编程宇宙中&#xff0c;链表就像是一座稳固的基石&#xff0c;支撑着众多复杂程序的构建。它以独特的魅力和强大的功能&#xff0c;在解决各类编程难题时发挥着至关重要的作用。今天&#xff0c;就让我们一同深入探索链表的奥秘。 目录 一、链表初相识 二、链表的结…...

微信小程序文件存储和获取的详细方案

在微信小程序中&#xff0c;要根据索引&#xff08;如自定义标识符&#xff09;检查是否存在对应的文件&#xff0c;可以通过以下方案实现。这里假设你已通过某种方式将文件路径与索引关联存储&#xff08;例如使用本地缓存 Storage&#xff09;&#xff0c;以下是完整流程&…...

java BCC异或校验例子

需求 对一个十六进制的字符串进行BCC校验 方法 private static String XORCheck(String rawMsg) {// 16进制字符串需要转成10进制数组进行校验&#xff0c;然后再返回16进制字符串用于与原来的字符匹配byte[] bytes HexDumpMsgFormat.hexStr2DesBytes(rawMsg);return BytesUt…...

[machine learning] DP(Data Parallel) vs DDP(Distributed Data Parallel)

DP和DDP是并行训练的两种方法&#xff0c;本文简单介绍它们两者的区别。 一、DP (Data Parallel) DP是单进程&#xff0c;多线程的&#xff0c;每个线程负责一个GPU&#xff0c;它只适用于一台机器。DP训练的流程如下图所示(图片转载自&#xff1a;https://medium.com/mlshar…...

今日头条文章爬虫教程

今日头条文章爬虫教程 随着互联网的发展&#xff0c;新闻资讯类平台如今日头条积累了海量的数据。对于数据分析师、研究人员等群体来说&#xff0c;获取这些数据进行分析和研究具有重要的价值。本文将介绍如何使用Python编写爬虫&#xff0c;爬取今日头条的文章数据。 一、准…...

鸿蒙应用开发—数据持久化之SQLite

文章目录 SQLite简介创建数据库添加数据查询数据更新数据删除数据升级数据库使用事务参考 SQLite简介 SQLite是一个轻量级关系数据库&#xff0c;占用资源很少&#xff0c;只有几百KB的大小&#xff0c;无需服务器支撑&#xff0c;是一个零配置、事务性的SQL数据库引擎。 相对…...

Docker Compose 部署 steamcmd 安装奈斯服务端

由于打算在云端服务器部署奈斯启示录服务端跟朋友们一起玩&#xff0c; 所以在云端搭建服务器&#xff0c; 顺便写下本文章记录搭建的过程。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 要使用 Docker Compose 部署 steamcmd&#xff08;Steam 命令行…...

K8s 1.27.1 实战系列(八)Service

一、Service介绍 1、Service 的作用与核心功能 Service 是 Kubernetes 中用于抽象一组 Pod 并提供稳定访问入口的资源。它解决了以下问题: ​Pod IP 不固定:Pod 可能因故障、扩缩容或更新导致 IP 变化,Service 通过 ClusterIP(虚拟 IP)提供固定访问地址。​负载均衡:自动…...

Scala编程_实现Rational的基本操作

在Scala中实现一个简单的有理数&#xff08;Rational&#xff09;类&#xff0c;并对其进行加法、比较等基本操作. 有理数的定义 有理数是可以表示为两个整数的比值的数&#xff0c;通常形式为 n / d&#xff0c;其中 n 是分子&#xff0c;d 是分母。为了确保我们的有理数始终…...

Android15 Camera框架中的StatusTracker

StatusTracker介绍 StatusTracker是Android15 Camera框架中用来协调Camera3各组件之间状态转换的类。 StatusTracker线程名&#xff1a;std::string("C3Dev-") mId "-Status" Camera3 StatusTracker工作原理 StatusTracker实现批处理&#xff08;状态…...

Manus 演示案例:谷歌公司运营模拟器游戏体验

一、项目背景与愿景 在科技行业蓬勃发展的当下&#xff0c;谷歌作为行业巨头&#xff0c;其成长历程充满了无数值得深入探究的决策智慧。这些决策不仅塑造了谷歌的辉煌&#xff0c;也为全球企业的发展提供了宝贵的借鉴。本项目旨在打造一款以谷歌公司发展为蓝本的运营模拟器游戏…...

【大模型基础_毛玉仁】2.1 大数据+大模型→新智能

【大模型基础_毛玉仁】2.1 大数据大模型→新智能 2.大语言模型架构2.1 大数据大模型→新智能2.1.1 大数据大模型→能力增强1&#xff09;Kaplan-McCandlish 扩展法则2&#xff09;Chinchilla 扩展法则 2.1.2 大数据大模型→能力扩展 2.大语言模型架构 大语言模型&#xff08;L…...

20天 - TCP 和 UDP 有什么区别?说说 TCP 的三次握手?TCP 是用来解决什么问题?

TCP 和 UDP 有什么区别&#xff1f; TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;用户数据报协议&#xff09;都是传输层的网络协议&#xff0c;它们的主要区别如下&#xff1a; 连接方式 TCP&#xff1a;面向连接的协议&#xff0c;类似于打电话&#xff0c…...

【设计模式】掌握建造者模式:如何优雅地解决复杂对象创建难题?

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。 由于实现了构建和装配的解耦。…...

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…...

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…...

蓝桥杯备赛-差分-重新排序

问题描述 给定一个数组 AA 和一些查询 Li,RiLi​,Ri​, 求数组中第 LiLi​ 至第 RiRi​ 个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查 询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可 以增加多少? 输入格式 输…...

①Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网https://item.taobao.com/item.htm?ftt&id784749793551 MODBUS TCP 通信单元 MODBUS TCP 转 RS485 MS-A1-50X1 系列概述 MS-A1-50X1 系列概述 MS-A1-50X1系列作为MODBUS TCP通信的服务器进行动作。可通…...

2025年四川烟草工业计算机岗位备考详细内容

四川烟草工业计算机岗位备考详细内容&#xff08;持续更新&#xff09; 文章目录 四川烟草工业计算机岗位备考详细内容&#xff08;持续更新&#xff09;一、计算机基础&#xff08;一&#xff09;计算机发展与组成计算机发展历程计算机系统组成软件系统 &#xff08;二&#x…...

Git 设置全局代理

Git 设置全局代理或项目代理 git config&#xff1a; 全局配置&#xff0c;设置git代理服务器 # 设置 HTTP 代理 git config --global http.proxy http://127.0.0.1:7897# 设置 HTTPS 代理 git config --global https.proxy http://127.0.0.1:7897# 设置所有协议的代理&…...

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名&#xff0c;并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名&#xff0c;并连续按两次…...

ROS实践(二)构建Gazebo机器人模型文件urdf

目录 一、基础语法 1. urdf文件组成 2. robot根标签 3. link 和 joint标签 4. sensor标签 二、 实验&#xff1a;使用launch文件启动rviz查看机器人模型 1. 编写机器人模型的urdf文件。 2. 编写launch文件。 3. 运行launch&#xff0c;查看效果。 URDF&#xff08;Unifi…...

论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)

论文英文题目&#xff1a;A spatial interaction model of Qin-Han Dynasty organisation on the northern frontier and the location of the Zhidao highway (China) 发表于&#xff1a;journal of archaeological science&#xff0c;影响因子&#xff1a;3.030 论文主要是…...

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)

文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…...

设计模式之建造者模式:原理、实现与应用

引言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将复杂对象的构建过程分解为多个简单的步骤&#xff0c;使得对象的创建更加灵活和可维护。建造者模式特别适用于构建具有多个组成部分的复杂对象。本文将深入探讨建造者模式的原…...

2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB

一、山羊优化算法 山羊优化算法&#xff08;Goat Optimization Algorithm, GOA&#xff09;是2025年提出的一种新型生物启发式元启发式算法&#xff0c;灵感来源于山羊在恶劣和资源有限环境中的适应性行为。该算法旨在通过模拟山羊的觅食策略、移动模式和躲避寄生虫的能力&…...

Apache Log4j 2

目录 1. Apache Log4j 2 简介 1.1 什么是Log4j 2&#xff1f; 1.2 Log4j 2 的主要特性 2. Log4j 2 的核心组件 2.1 Logger 2.2 Appender 2.3 Layout 2.4 Filter 2.5 Configuration 3. Log4j 2 的配置 4. Log4j 2 的使用示例 4.1 Maven 依赖 4.2 示例代码 4.3 输出…...

ArcGIS Pro字段编号相关代码

一、引言 在地理信息系统&#xff08;GIS&#xff09;的数据管理与分析中&#xff0c;字段操作是不可或缺的一环。 SHP文件作为常见的地理数据存储格式&#xff0c;其字段的灵活运用对于数据的组织、展示和分析具有重要意义。 在实际工作中&#xff0c;常常需要对字段进行编…...

ubuntu22.04机器人开发环境配置

1. ros2环境配置&#xff08;humble&#xff09; #配置源 # https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update && sudo apt install curl -y# …...

万字深度剖析——JS数据结构(上)

数组本质是对象&#xff0c;键就是索引&#xff0c;值就是元素。 push /unshift 在数组最后/最前添加 pop /shift 把数组最后/最前的元素删除,返回的是被删除的元素 splice(0,2&#xff0c;5)从第0给位置开始删除2个元素&#xff0c;并添加一个元素 数组自带的…...

golang dlv调试工具

golang dlv调试工具 在goland2022.2版本 中调试go程序报错 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.7 (maximum supported version 1.19) 即使你go install了新的dlv也无济于事 分析得出Goland实际使用的是 Goland安装目录下dlv 例…...