Rust脚本执行工具rust-script的使用:无需编译直接运行.rs文件的高效开发体验

Rust脚本执行工具rust-script的使用:无需编译直接运行.rs文件的高效开发体验

rust-script是一个可以直接运行Rust脚本文件的工具,无需任何设置或显式编译步骤,并且可以在脚本文件中无缝使用指定的crate依赖。

安装rust-script

cargo install rust-script

示例用法

以下是内容中提供的示例:

#!/usr/bin/env rust-script
//! 依赖可以直接在脚本文件中指定如下:
//!
//! ```cargo
//! [dependencies]
//! rand = "0.8.0"
//! ```

use rand::prelude::*;

fn main() {
    // 生成随机数
    let x: u64 = random();
    println!("随机数: {}", x);
}

完整示例demo

下面是一个更完整的示例,展示如何使用rust-script编写带有依赖的Rust脚本:

#!/usr/bin/env rust-script
//! 这是一个文件操作脚本示例
//!
//! ```cargo
//! [dependencies]
//! walkdir = "2.3"
//! anyhow = "1.0"
//! ```

use walkdir::WalkDir;
use anyhow::Result;

fn main() -> Result<()> {
    // 遍历当前目录
    for entry in WalkDir::new(".")
        .into_iter()
        .filter_map(|e| e.ok()) 
    {
        // 获取文件路径
        let path = entry.path();
        if path.is_file() {
            // 打印文件信息
            println!("文件名: {}", path.display());
            println!("文件大小: {} bytes", path.metadata()?.len());
            println!("---");
        }
    }
    Ok(())
}

使用说明

  1. 在脚本第一行添加shebang:#!/usr/bin/env rust-script
  2. 在注释中指定依赖(使用cargo.toml格式)
  3. 给脚本添加可执行权限:chmod +x script.rs
  4. 直接运行脚本:./script.rs

系统要求

Rust版本1.64或更高版本。

相关项目

  • cargo-script - rust-script从中fork出来的未维护项目
  • cargo-eval - cargo-script的维护分支
  • cargo-play - 本地Rust playground
  • runner - 用于运行Rust代码片段的工具
  • scriptisto - 与语言无关的"shebang解释器",可以用编译语言编写脚本

许可证

rust-script主要根据MIT许可证和Apache许可证(版本2.0)的条款分发。


1 回复

Rust脚本执行工具rust-script的使用指南

简介

rust-script是一个让Rust代码像脚本语言一样直接运行的工具,无需手动编译步骤。它允许开发者直接执行.rs文件,极大地简化了小型Rust程序或快速原型的开发流程。

安装方法

使用Cargo安装rust-script:

cargo install rust-script

基本使用方法

直接运行.rs文件

rust-script your_script.rs

示例脚本

创建一个简单的hello.rs文件:

// hello.rs
fn main() {
    println!("Hello, rust-script!");
    println!("This is running without explicit compilation!");
}

然后直接运行:

rust-script hello.rs

高级功能

1. 依赖管理

rust-script支持在脚本中直接声明依赖:

//! ```cargo
//! [dependencies]
//! rand = "0.8"
//! ```

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    println!("Random number: {}", rng.gen_range(1..=100));
}

2. 脚本参数

可以像普通Rust程序一样访问命令行参数:

// args.rs
fn main() {
    for (i, arg) in std::env::args().enumerate() {
        println!("arg {}: {}", i, arg);
    }
}

运行:

rust-script args.rs first second third

3. 缓存控制

rust-script会缓存编译结果以提高性能。如果需要强制重新编译:

rust-script --clear-cache your_script.rs

4. 表达式模式

直接执行Rust表达式而不需要完整的main函数:

rust-script --expr 'println!("1 + 2 = {}", 1 + 2)'

实际应用示例

文件处理脚本

// file_stats.rs
use std::env;
use std::fs;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() < 2 {
        eprintln!("Usage: {} <filename>", args[0]);
        return;
    }

    let filename = &args[1];
    match fs::metadata(filename) {
        Ok(metadata) => {
            println!("File: {}", filename);
            println!("Size: {} bytes", metadata.len());
            println!("Type: {}", if metadata.is_dir() { "directory" } else { "file" });
        }
        Err(e) => eprintln!("Error: {}", e),
    }
}

运行:

rust-script file_stats.rs Cargo.toml

完整示例DEMO

下面是一个完整的rust-script示例,展示了如何创建一个HTTP请求脚本:

// http_request.rs
//! ```cargo
//! [dependencies]
//! reqwest = { version = "0.11", features = ["blocking"] }
//! tokio = { version = "1.0", features = ["full"] }
//! ```

use reqwest::blocking::get;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // 发送HTTP GET请求
    let resp = get("https://httpbin.org/get")?;
    
    // 输出响应状态和内容
    println!("Status: {}", resp.status());
    println!("Headers:\n{:#?}", resp.headers());
    println!("Body:\n{}", resp.text()?);
    
    Ok(())
}

运行方法:

rust-script http_request.rs

优势

  1. 快速迭代:无需手动编译,直接修改和运行
  2. 依赖管理:内联Cargo.toml依赖声明
  3. 便携性:单个.rs文件包含所有逻辑和依赖信息
  4. 缓存优化:自动重用之前的编译结果

注意事项

  1. 首次运行某个脚本会有编译延迟
  2. 适合小型工具和原型开发,大型项目仍建议使用标准Cargo工作流
  3. 脚本中的依赖声明使用特殊注释语法

rust-script为Rust开发者提供了类似Python等脚本语言的即时执行体验,是快速测试想法或编写实用小工具的理想选择。

回到顶部