Ruby代码在没有Rails的情况下自动重新加载

时间:2014-09-02 19:05:33

标签: ruby pry

使用Rails,Sinatra,Padrino ......我习惯于在修改时自动重新加载代码。

在处理非基于Rack的Web框架的纯Ruby项目时,如何获得相同的行为。

我想启动一个pry控制台,并且能够测试我源代码的最新修改。

3 个答案:

答案 0 :(得分:2)

你只需要在某处定义一个清除内存中旧内容的方法,然后重新加载构成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这样的库。

答案 1 :(得分:0)

我将创建一个run.rb脚本,该脚本分叉进程并在该单独进程中运行代码。在父进程中使用https://github.com/thibaudgg/rb-fsevent来监视文件系统的更改,每当检测到FS更改时都会终止子进程,并使用更新的代码分叉新的子进程。

答案 2 :(得分:0)

经过一番探索并尝试了给定的答案,我意识到我正在以错误的方式思考我的问题。

虽然重新加载项目很不错,但这需要一定的准备。

对于Ruby,我发现编辑器上的自定义快捷方式更方便:

  1. 保存文件
  2. 向我的Pry会话发送load file/path.rb命令
  3. 这不需要为每个项目提供任何类型的额外代码或配置。但是,其他答案可以与Guard结合使用以进行自动重新加载。这实际上是我的问题的标题,但现在我意识到一个按键解决方案更实用。