【发布时间】:2014-09-02 19:05:33
【问题描述】:
使用 Rails、Sinatra、Padrino...我已经习惯了在进行修改时自动重新加载代码。
在处理不是基于 Rack 的 Web 框架的普通 Ruby gem 项目时,如何获得相同的行为。
我只想启动一个pry 控制台并立即能够测试我的源代码的最新修改。
【问题讨论】:
-
我认为 ActiveSupport 使这个魔法成为可能,因此它可以移植到其他环境。
使用 Rails、Sinatra、Padrino...我已经习惯了在进行修改时自动重新加载代码。
在处理不是基于 Rack 的 Web 框架的普通 Ruby gem 项目时,如何获得相同的行为。
我只想启动一个pry 控制台并立即能够测试我的源代码的最新修改。
【问题讨论】:
您只需要在某处定义一个方法来清除内存中的旧内容,然后重新加载构成您的 gem 的所有文件:
def reload!
Object.send(:remove_const, :ProjectNamespace)
path = File.expand_path("../", __FILE__)
Dir.glob("#{path}/**/*.rb") { |f| load f }
end
由于您使用的是 Pry,因此如果您希望将其排除在代码库之外,可以在项目的 .pryrc 中定义它。
您甚至可以在模块内部定义重新加载逻辑,只要它包含在您要重新加载的文件中,一切都会好起来的:
module ProjectNamespace
module_function
def reload!
# Reload code
end
end
ProjectNamespace.reload!
如果您需要更托管的解决方案(例如定时重新加载),您应该查看像 Rubyworks' autoreload 这样的库。
【讨论】:
我会创建一个 run.rb 脚本来分叉一个进程并在该单独进程中运行您的代码。在父进程中使用https://github.com/thibaudgg/rb-fsevent 来监视文件系统的更改,每当检测到 FS 更改时终止子进程并使用更新的代码派生一个新的子进程。
【讨论】:
经过一些探索和尝试给出的答案后,我意识到我正在以错误的方式思考我的问题。
虽然重新加载项目很好,但这需要一定的准备。
对于 Ruby,我发现在我的编辑器上使用自定义快捷方式更方便:
load file/path.rb 命令这不需要为每个项目添加任何类型的额外代码或配置。但是,其他答案可以与 Guard 结合使用以进行自动重新加载。这实际上是我的问题的标题,但现在我意识到一个按键解决方案更实用。
【讨论】:
load 仅覆盖(即不清除)以前的定义。假设您从一个类中删除了一个方法:在您重新load 文件后,仍然可以从控制台访问它。
.pryrc file中定义方法。