17 个版本 (5 个重大更新)

使用旧 Rust 2015

0.6.0 2018年6月27日
0.5.0 2018年5月20日
0.4.2 2018年5月7日
0.3.2 2018年4月14日
0.1.8 2016年6月29日

#4#effort

每月下载 41

MIT 许可证

24KB
426 行代码(不含注释)

hotswap

Crates.io Linux Build Status Windows Build Status

一个用于最小化努力进行热插拔运行代码的库,需要使用夜间构建的 Rust。

请注意,该库目前是一个原型,可能会频繁崩溃。

使用方法

  • hotswaphotswap-runtime 依赖项添加到您的 Cargo.toml 文件中。
  • Cargo.toml 中添加具有相同项目名称和路径的 dylib 构建。
  • 添加 #![feature(plugin, const_fn)] 功能门。
  • 导入插件 #![plugin(hotswap)]
  • 使用 #[hotswap] 修饰符注释您要热插拔的函数。
  • #![hotswap_header] 属性添加到程序顶部。
  • 在调用任何热插拔函数之前,将 #![hotswap_start] 添加到程序入口点,使用 unsafe { hotswap_start!() }

当前限制

  • 更改热插拔函数签名 导致段错误。
    • 可能可以通过将类型存储为元数据来修复此问题。
  • 需要用户代码使用一些非局部功能门。

示例

# Cargo.toml

[package]
name = "hotswapdemo"
version = "0.1.0"

[lib]
# This must be the same as the package name (with hyphens replaced with
# underscores). Anything else will cause an error at runtime.
name = "hotswapdemo"
crate-type = ["dylib"]
path = "src/main.rs"

[dependencies]
hotswap = "*"
hotswap-runtime = "*"
// main.rs

#![feature(plugin, const_fn)]
#![plugin(hotswap)]
#![hotswap_header]

use std::thread::sleep;
use std::time::Duration;

#[hotswap]
fn test(test: i32) -> () {
    println!("Foo: {}", test);
}

fn main() {
    unsafe { hotswap_start!() }

    let mut i = 1;
    loop {
        test(i);
        i += 1;
        sleep(Duration::from_millis(2000));
    }
}

就是这样!

从那里您可以运行二进制文件

> cargo run
     Running `target/debug/hotswapdemo`
Foo: 1
Foo: 2
Foo: 3

然后,一旦它正在运行,您可以编辑打印代码,例如。

    println!("Bar: {} :)", test);

一旦您在另一个终端(或使用后台在同一个终端)重新编译代码,您将看到更改!

> cargo build --lib
   Compiling hotswapdemo v0.1.0 [...]
> fg
Foo: 7
Foo: 8
Bar: 9 :)
Bar: 10 :)

运行中的代码将更新而无需重新启动二进制文件或丢失状态!

另请参阅

无运行时依赖