4

我想用 Dart 构建一个应用服务器。dart:io 库中的 httpServer 无疑是一个很好的起点。但是我很难在不重新启动服务器进程的情况下“部署”应用程序。

更准确地说:我希望在 Java 中拥有类似 servlet 容器的东西,比如 Tomcat,我可以轻松地在其中部署或重新部署应用程序,而无需重新启动容器。我想我可以利用镜像系统,它原则上允许我从文件系统加载一个库及其包含的类。但不幸的是,我似乎无法重新加载库。例如,当我向库中添加新类或更改现有类的编码时,库的新反射而不重新启动 dart 进程不会反映更改。只有当我停止该过程并再次重新启动它时,更改才可见。

那么:有没有办法在同一个 Dart 进程中清理镜像系统并让它再次加载库及其类?

4

2 回答 2

1

我认为隔离物非常适合这一要求。

我自己还没有太多使用它们,但据我所知,您可以动态加载和卸载它们。文档还不是很广泛。我发现了一些东西:

于 2014-04-15T19:24:31.110 回答
1

所以,是的,在 Dart 中可以在运行时动态(重新)加载 dart 文件。每个新的隔离区都有自己的 MirrorSystem。如果你想重新加载一个 dart 文件,你必须创建一个新的隔离并使用这个隔离的 MirrorSystem 来迭代这个 MirrorSystem 已知的库中的内容。如果您的 dart 文件是 MirrorSystem 已知库的一部分,则此文件中包含的所有函数和类都会重新加载和反映。

这种解决方案有一些缺点:首先,它相当重量级。隔离间通信的编程很麻烦。还要观察每次重新加载是否会增加内存消耗。其次,解决方案不是真正动态的:隔离仅加载在设计时“已知”的库。它们必须直接或间接导入到包含静态函数的 dart 文件中,该静态函数在创建隔离时调用。

如何改善这种情况的两个想法: 1. 如果 Isolate 的 spawn 和 spawnUri 方法可以获取一个附加库列表作为参数,这将有所帮助,这些库包含在 isolate 的 MirrorSystem 中。2、Java中的类加载器独立于进程和线程。他们只是加载类。为什么这在 Dart 中不可能?

于 2014-05-03T11:00:23.920 回答