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 次
24KB
426 行代码(不含注释)
hotswap
一个用于最小化努力进行热插拔运行代码的库,需要使用夜间构建的 Rust。
请注意,该库目前是一个原型,可能会频繁崩溃。
使用方法
- 将
hotswap
和hotswap-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 :)
运行中的代码将更新而无需重新启动二进制文件或丢失状态!