使用Rails,Sinatra,Padrino ......我习惯于在修改时自动重新加载代码。
在处理非基于Rack的Web框架的纯Ruby项目时,如何获得相同的行为。
我想启动一个pry
控制台,并且能够测试我源代码的最新修改。
答案 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,我发现编辑器上的自定义快捷方式更方便:
load file/path.rb
命令这不需要为每个项目提供任何类型的额外代码或配置。但是,其他答案可以与Guard
结合使用以进行自动重新加载。这实际上是我的问题的标题,但现在我意识到一个按键解决方案更实用。