Rust脚本–将Rust文件和表达式作为脚本运行,无需任何设置或配合

2020-11-23 04:03:09

使用rust-script脚本,可以像Shell或Python脚本一样执行Rust文件和表达式。功能包括:

rust-script的主要用途是将Rust源文件作为脚本运行。例如:

$ echo'println!(“ Hello,World!”);' > hello.rs $锈脚本hello.rs您好,世界! $ rust-script hello#您可以不使用文件扩展名了,世界!

在后台,将生成并构建一个Cargo项目(除非编译失败或使用-o / --cargo-output选项,否则隐藏Cargo输出)。脚本被编译时,脚本的首次调用会变慢-缓存已构建的可执行文件时,未修改脚本的后续调用将很快。

从上面的示例可以看出,不需要使用fn main(){}函数。如果不存在,脚本文件将包装在fn main(){...}块中。

rust-script将在脚本中查找嵌入式依赖关系和清单信息,如以下两个等效的now.rs变体所示:

#!/ usr / bin / env rust-脚本//!这是一个常规的板条箱文档注释,但也包含部分// !!货物舱单。注意使用* fenced *代码块和//!。 `cargo`“语言”。 //! //! ```货物//! [依赖项] //!时间=“ 0.1.25” //! ```fn main(){println! (“ {}”,时间::现在().rfc822z()); }

// cargo-deps:time =“ 0.1.25” //您也可以省略版本号,在这种情况下,假定版本号为“ *”。同样,`cargo-deps`注释*必须*是单行//注释,并且*必须*是文件中//在hashbang之后的第一件事。 //多个依存关系应以逗号分隔:// cargo-deps:time =“ 0.1.25”,libc =“ 0.2.5” fn main(){println! (“ {}”,时间::现在().rfc822z()); }

--force:强制重建脚本。如果要使用其他工具链强制重新编译,则很有用。

--gen-pkg-only:生成Cargo软件包,但不编译或运行它。有效地将脚本“解包”到Cargo包中。

在Unix系统上,您可以在Rust脚本中使用#!/ usr / bin / env rust-script作为shebang行。这样一来,您就可以直接执行脚本文件(无需扩展名为.rs)。

如果使用Windows,则可以将.ers扩展名(可执行的Rust-重命名的.rs文件)与rust-script关联。这使您只需像其他任何可执行文件或脚本一样命名Rust脚本即可执行Rust脚本。

这可以使用rust-script --install-file-association命令完成。使用rust-script --uninstall-file-association卸载文件关联。

如果要使脚本可跨平台使用,请同时使用hashbang行并为文件指定.ers文件扩展名。

使用-e / --expr选项,可以直接评估Rust表达式,并使用-d / --dep添加依赖项(如果有):

$ rust-script -e'1 + 2'3 $ rust-script --dep time --expr“ time :: OffsetDateTime :: now_utc()。format(time :: Format :: Rfc3339).to_string()”` “ 2020-10-28T11:42:10 + 00:00” $#使用特定版本的时间箱(而不是默认的最新版本):$ rust-script --dep time = 0.1.38 -e“ time :: now()。rfc822z()。to_string()“” 2020-10-28T11:42:10 + 00:00“

给定的代码被嵌入到一个块表达式中,使用调试格式化程序(即{:?})进行评估并打印出来。

您可以使用rust-script编写快速过滤器,方法是为从stdin读取的每一行指定一个闭包,如下所示:

$ cat now.ers | rust-script --loop \“ let mut n = 0; move | l | {n + = 1; println!(\” {:> 6}:{} \“,n,l.trim_right())}” 1 :// cargo-deps:time =“ 0.1.25” 3:fn main(){4:println! (“ {}”,time :: now().rfc822z()); 5:}

您可以使用--count标志来实现与上述类似的效果,该标志会使行号作为第二个参数传递给您的闭包:

$ cat now.ers | rust-script --count --loop \“ | l,n | println!(\” {:> 6}:{} \“,n,l.trim_right())” 1://货物下降:时间=“ 0.1.25” 2:fn main(){3:println! (“ {}”,time :: now().rfc822z()); 4:}

RUST_SCRIPT_BASE_PATH:rust-script用于解析相对依赖性路径的基本路径。请注意,这不一定与工作目录或在其中编译脚本的目录相同。

RUST_SCRIPT_SAFE_NAME:正在运行的脚本的文件名(没有文件扩展名)。对于脚本,这是从脚本的文件名派生的。对于这些调用,也可能是“ expr”或“ loop”。

RUST_SCRIPT_PATH:假设脚本存在,则为正在运行的脚本的绝对路径。设置为表达式的空字符串。

您可以使用模板来避免重新指定通用代码和依赖项。您可以通过运行rust-script --list-templates找出存储模板的目录并查看模板列表。

模板是具有两个占位符的Rust源文件:#{prelude}用于自动生成的前奏(应放置在模板的顶部),而#{script}用于脚本本身的内容。

例如,添加依赖项并导入一些其他符号的最小表达式模板可能是:

// // cargo-deps:itertools =“ 0.6.2”#![allow(unused_imports)]#{prelude} use std :: io :: prelude :: *;使用std :: mem;使用itertools :: Itertools; fn main(){让结果= {#{脚本}}; println! (“ {:?}”,结果); }

如果将其作为grabbag.rs存储在模板文件夹中,则可以通过--template选项传递名称grabbag来使用它,如下所示:

此外,还有三个内置模板:expr,loop和loop-count。这些用于--expr,-loop和--loop --count调用形式。可以通过将相同名称的模板放置在template文件夹中来覆盖它们。

如果相关,请在设置RUST_LOG = rust_script = trace环境变量的情况下运行,以查看详细的日志输出并将该输出附加到问题上。