#static #async #module-level

xboot

static variables like module-level database connections can be initialized asynchronously before the program starts. / 在程序启动前通过异步函数初始化静态变量,如模块级数据库连接。

18 releases

0.1.28 Jan 22, 2025
0.1.27 Jan 22, 2025

#277 in Text processing

Download history 319/week @ 2025-01-07 15/week @ 2025-01-14 1454/week @ 2025-01-21 14/week @ 2025-01-28 11/week @ 2025-02-04 6/week @ 2025-02-11

1,488 downloads per month
Used in 6 crates (5 directly)

MulanPSL-2.0

10KB
71 lines

xboot

English Readme

With the help of linkme, call an asynchronous function to initialize static variables.

You can connect to the database before the program starts and set it as a module-level variable, refer to xkv: redis global connector.

linkme will report an error when linking with rust-lld on Linux Missing symbol on Linux.

Please use mold instead, and configure the environment variables as follows:

export RUSTFLAGS="$RUSTFLAGS -C linker=clang -C link-arg=-fuse-ld=/usr/bin/mold"

中文说明

借助 linkme,调用异步函数初始化静态变量。

可在程序启动之前连上数据库,并设置为一个模块级别的变量,参考 xkv: redis 全局连接器

linkme 在 Linux 上用 rust-lld 链接会报错 Missing symbol on Linux

请改用 mold ,配置环境变量如下:

export RUSTFLAGS="$RUSTFLAGS -C linker=clang -C link-arg=-fuse-ld=/usr/bin/mold"

演示代码

use aok::{Result, OK};
use tokio::time::{sleep, Duration};
use tracing::info;

pub struct Client {}

impl Client {
  pub async fn test(&self) {
    info!("client test success");
  }
}

pub async fn connect() -> Result<Client> {
  info!("Sleeping for 3 seconds...");
  sleep(Duration::from_secs(3)).await;
  Ok(Client {})
}

static_::init!(CLIENT: Client {
  connect().await
});

#[tokio::main]
async fn main() -> Result<()> {
  static_::init().await?;
  info!("inited");
  CLIENT.test().await;
  OK
}

About

This project is an open-source component of i18n.site ⋅ Internationalization Solution.

关于

本项目为 i18n.site ⋅ 国际化解决方案 的开源组件。

Dependencies

~2.5–8.5MB
~68K SLoC