【问题标题】:How to reload raku modules at runtime, for debug purposes?出于调试目的,如何在运行时重新加载 raku 模块?
【发布时间】:2019-11-10 08:05:44
【问题描述】:

我正在我的 raku rest/API 应用程序上动态加载模块。

我想避免每次对我的模块进行任何修改时服务器都重新启动。

有没有办法在每次调用 require 时重新加载 raku 模块?

try require ::('Foo');

【问题讨论】:

    标签: raku


    【解决方案1】:

    Cro 执行this。您可以在 Cro 之上构建您的服务器,这就是我的建议。或者,您可以研究 Cro 代码以了解它如何处理自动重启。 Cro::Tools::Runner 我认为是一个很好的起点。

    【讨论】:

      【解决方案2】:

      在加载之前,您必须考虑到所有模块都是precompiled。您正在加载的不是源代码,而是从中生成的CompUnit,默认情况下位于.precomp 目录中。例如,这种预编译也会处理版本,但主要的是它是字节码,而不是源代码。

      除了掌握机器(即检查源代码中是否有更改、预编译、加载预编译的二进制文件并运行它们)之外,没有简单的解决方法,所以我认为,在这种情况下,最好问问自己是否真的有这个用例;也许您需要做的是以某种方式加速服务器重新启动,可能通过使用sake 的自动化,或者从 git 挂钩运行集成测试而无需重新启动服务器

      【讨论】:

        【解决方案3】:

        您不能在进程中重新加载模块。当查找模块标识时,它会被缓存,并且第二次查找该标识将继续使用第一次匹配的 CompUnit。预编译与此无关。

        见:

        https://github.com/rakudo/rakudo/blob/0b8ede6c459be752adef9cbbf7b59c961d9df0b0/src/core.c/CompUnit/Repository/Installation.pm6#L445-L453

        https://github.com/rakudo/rakudo/blob/0b8ede6c459be752adef9cbbf7b59c961d9df0b0/src/core.c/CompUnit/Repository/FileSystem.pm6#L13-L21

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-18
          • 1970-01-01
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 2017-07-29
          • 1970-01-01
          • 2011-02-20
          相关资源
          最近更新 更多