Rust中的运行时插件

iq3niunx  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(294)

我们有一个商业销售的应用程序,目前是用Java和Python编写的。我们目前正在考虑转移到Rust的性能和非崩溃的原因。
在我们目前的Java/Python架构中,我们有一个管理特定客户想要的定制的特性。这涉及到将Java jar/类和python文件放在一个为特定客户定制而指定的特定文件夹下。在应用程序配置中,Java类路径和PYTHON_PATH将此文件夹放在包含普通的、未定制的应用程序代码的文件夹之前。因此,此特殊文件夹中的任何代码都将覆盖应用程序的正常、未定制的行为。
我们希望在迁移到Rust时以某种形式保留这一特性。我们当然希望避免向客户分发核心应用的源代码(现在主要是Java),并让客户进行编译,如果我们使用Rust的模块特性,我们将需要这样做。
当我们进入Rust时,有没有办法实现这个特性?
目标操作系统是Linux和Windows的混合。

ffscu2ro

ffscu2ro1#

听起来你需要某种插件架构,有一个在运行时加载的动态库(也是用Rust编写的)。
不幸的是,Rust doesn't have a stable ABI yet,这意味着这些库必须用构建主应用程序的完全相同的编译器来编译。一个解决方案是从插件端暴露一个C ABI,并使用C FFI来调用它,如果你能忍受由此带来的不安全和麻烦的话。还有abi_stable机箱,它可能更安全/更简单地使用。
脚本语言可能是另一个探索的途径。例如,Rhai是一种专门为Rust应用程序开发的语言,它可以无缝地互操作。当然,脚本部分的性能不会像Rust本地代码那样好。

gj3fmq9x

gj3fmq9x2#

我认为,如果不重新编译它,或者至少编译您打算为单个用户创建的config.rs文件,这是不可能的。
假设最终用户的系统上未安装Rust,则可能有以下几种替代方法:

  • 使用.yaml文件加载配置(类似于GitHub操作的工作方式)
  • 允许用户运行自定义程序(您可以使用时雄::process以异步方式运行它们)
  • 使用rhaiscript(我个人更喜欢这个选项)
azpvetkf

azpvetkf3#

摘自modules feature的官方语言文档
您可以将商业项目设置为将源代码作为外部机箱,然后使用path attribute将其加载到主项目中。
一个最小的例子,已经在文件上:

#[path = "thread_files"]
mod thread {
    // Load the `local_data` module from `thread_files/tls.rs` relative to
    // this source file's directory.
    #[path = "tls.rs"]
    mod local_data;
}

相关问题