Rust的Deno包管理库deno_package_json的使用,高效解析与操作package.json文件的Rust工具

deno_package_json

Deno CLI 中使用的 package.json 实现。

安装

在项目目录中运行以下 Cargo 命令:

cargo add deno_package_json

或者在 Cargo.toml 中添加以下行:

deno_package_json = "0.13.0"

使用示例

下面是一个完整的示例,展示如何使用 deno_package_json 解析和操作 package.json 文件:

use deno_package_json::PackageJson;
use std::path::Path;

fn main() {
    // 读取 package.json 文件
    let package_json_path = Path::new("./package.json");
    let package_json = PackageJson::load(package_json_path).expect("Failed to load package.json");
    
    // 获取包名和版本
    println!("Package name: {}", package_json.name);
    println!("Version: {}", package_json.version);
    
    // 检查是否有特定的依赖
    if let Some(dependencies) = &package_json.dependencies {
        if dependencies.contains_key("react") {
            println!("This package depends on React");
        }
    }
    
    // 获取脚本
    if let Some(scripts) = &package_json.scripts {
        for (name, script) in scripts {
            println!("Script {}: {}", name, script);
        }
    }
    
    // 修改并保存 package.json
    let mut package_json = package_json;
    package_json.version = "1.2.3".to_string();
    package_json.save(package_json_path).expect("Failed to save package.json");
}

完整示例代码

以下是一个更完整的示例,展示了 deno_package_json 的更多功能:

use deno_package_json::PackageJson;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建或加载 package.json 文件
    let path = Path::new("./package.json");
    let mut package_json = if path.exists() {
        PackageJson::load(path)?
    } else {
        // 创建新的 package.json 对象
        PackageJson::empty()
    };

    // 设置基本属性
    package_json.name = "my-awesome-package".to_string();
    package_json.version = "1.0.0".to_string();
    package_json.description = Some("A demonstration of deno_package_json".to_string());
    
    // 添加依赖项
    package_json.dependencies
        .get_or_insert_with(Default::default)
        .insert("serde".to_string(), "^1.0".to_string());
    
    // 添加开发依赖项
    package_json.dev_dependencies
        .get_or_insert_with(Default::default)
        .insert("deno_package_json".to_string(), "^0.13.0".to_string());
    
    // 添加脚本
    package_json.scripts
        .get_or_insert_with(Default::default)
        .insert("test".to_string(), "cargo test".to_string());
    
    // 保存到文件
    package_json.save(path)?;
    
    // 打印包信息
    println!("成功创建/更新 package.json:");
    println!("名称: {}", package_json.name);
    println!("版本: {}", package_json.version);
    println!("描述: {:?}", package_json.description);
    
    Ok(())
}

文档

更多详细信息请参考官方文档。

仓库

源代码托管在 GitHub。

所有者

  • David Sherret
  • denobot

许可证

MIT


1 回复

以下是根据您提供的内容整理的完整指南,我将先展示已有的示例,然后补充一个完整的demo示例:

已提供的示例代码汇总

  1. 解析package.json文件
use deno_package_json::PackageJson;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let package_json = PackageJson::load(Path::new("./package.json"))?;
    
    println!("项目名称: {}", package_json.name);
    println!("版本号: {}", package_json.version);
    println!("描述: {}", package_json.description.unwrap_or_default());
    
    Ok(())
}
  1. 创建新的package.json
use deno_package_json::PackageJson;

fn main() {
    let mut package_json = PackageJson::default();
    package_json.name = "my-awesome-project".to_string();
    package_json.version = "1.0.0".to_string();
    package_json.description = Some("一个超棒的项目".to_string());
    
    println!("{}", package_json.to_string());
}
  1. 修改现有字段
use deno_package_json::PackageJson;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut package_json = PackageJson::load(Path::new("./package.json"))?;
    
    package_json.version = "2.0.0".to_string();
    package_json.scripts.insert("test".to_string(), "echo \"Error: no test specified\" && exit 1".to_string());
    package_json.dependencies.insert("serde".to_string(), "^1.0".to_string());
    
    package_json.save()?;
    
    Ok(())
}
  1. 处理依赖项
use deno_package_json::PackageJson;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let package_json = PackageJson::load(Path::new("./package.json"))?;
    
    if let Some(version) = package_json.dependencies.get("react") {
        println!("React版本: {}", version);
    }
    
    for (name, version) in &package_json.dependencies {
        println!("{}: {}", name, version);
    }
    
    Ok(())
}

完整示例demo

下面是一个综合使用deno_package_json库的完整示例,展示了从创建、修改到验证的完整流程:

use deno_package_json::PackageJson;
use std::path::Path;
use std::collections::HashMap;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 创建新的package.json
    let mut package_json = PackageJson::default();
    package_json.name = "deno-rust-integration".to_string();
    package_json.version = "0.1.0".to_string();
    package_json.description = Some("Deno与Rust集成示例项目".to_string());
    
    // 2. 添加脚本
    let mut scripts = HashMap::new();
    scripts.insert("start".to_string(), "deno run main.ts".to_string());
    scripts.insert("test".to_string(), "deno test".to_string());
    package_json.scripts = scripts;
    
    // 3. 添加依赖
    let mut dependencies = HashMap::new();
    dependencies.insert("oak".to_string(), "^10.5.1".to_string());
    dependencies.insert("deno_std".to_string(), "0.128.0".to_string());
    package_json.dependencies = dependencies;
    
    // 4. 添加开发依赖
    let mut dev_dependencies = HashMap::new();
    dev_dependencies.insert("typescript".to_string(), "^4.3.5".to_string());
    package_json.dev_dependencies = dev_dependencies;
    
    // 5. 添加自定义字段
    package_json.other.insert("deno".to_string(), serde_json::json!({
        "unstable": true,
        "importMap": "./import_map.json"
    }));
    
    // 6. 保存到文件
    let path = Path::new("./package.json");
    package_json.save_to(path)?;
    
    // 7. 重新加载验证
    let loaded = PackageJson::load(path)?;
    println!("成功创建/修改的package.json:\n{}", loaded.to_string());
    
    // 8. 验证内容
    if let Some(deno_config) = loaded.other.get("deno") {
        println!("Deno配置: {}", deno_config);
    }
    
    // 9. 检查必须字段
    if loaded.name.is_empty() || loaded.version.is_empty() {
        eprintln!("错误: name和version字段必须填写");
    } else {
        println!("package.json验证通过");
    }
    
    Ok(())
}

这个完整示例展示了:

  1. 创建全新的package.json结构
  2. 设置基础信息(名称、版本、描述)
  3. 添加npm脚本配置
  4. 管理依赖项和开发依赖项
  5. 处理自定义字段(特别是Deno特有的配置)
  6. 文件保存和重新加载验证
  7. 基本验证逻辑

注意事项:

  • 实际使用时请确保有文件写入权限
  • 修改前建议备份现有package.json文件
  • 所有HashMap操作都可以替换为更符合业务逻辑的代码
回到顶部