【问题标题】:Ruby code auto-reloaded without RailsRuby 代码在没有 Rails 的情况下自动重新加载
【发布时间】:2014-09-02 19:05:33
【问题描述】:

使用 Rails、Sinatra、Padrino...我已经习惯了在进行修改时自动重新加载代码。

在处理不是基于 Rack 的 Web 框架的普通 Ruby gem 项目时,如何获得相同的行为。

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

【问题讨论】:

  • 我认为 ActiveSupport 使这个魔法成为可能,因此它可以移植到其他环境。

标签: ruby pry


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      经过一些探索和尝试给出的答案后,我意识到我正在以错误的方式思考我的问题。

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

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

      1. 保存文件
      2. 向我的 Pry 会话发送 load file/path.rb 命令

      这不需要为每个项目添加任何类型的额外代码或配置。但是,其他答案可以与 Guard 结合使用以进行自动重新加载。这实际上是我的问题的标题,但现在我意识到一个按键解决方案更实用。

      【讨论】:

      • 这并不总是如您所愿。 load 仅覆盖(即不清除)以前的定义。假设您从一个类中删除了一个方法:在您重新load 文件后,仍然可以从控制台访问它。
      • 另外,如果你想让它远离你的代码库,你可以在你的项目的.pryrc file中定义方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多