#run-time #running #function #hotswap #encapsulating

nightly hotswap-runtime

封装热插拔运行时依赖的库

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2017年12月8日
0.1.0 2016年9月24日

258#running

MIT 许可证

3KB

热插拔

Crates.io Linux Build Status Windows Build Status

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

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

用法

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

当前限制

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

示例

# 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 :)

运行中的代码将在不重新启动二进制文件或丢失状态的情况下更新!

另请参阅

依赖项

~1MB
~18K SLoC