# “reloadable\_patch”到底是什么？

**URL:** https://meta.discourse.org/t/what-is-reloadable-patch-exactly/160247
**Category:** Development
**Created:** [2020年八月9日 11:40 UTC](https://meta.discourse.org/t/what-is-reloadable-patch-exactly/160247 "2020-08-09T11:40:00Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![neounix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/neounix/32/215617_2.png) [@neounix](https://meta.discourse.org/u/neounix)
#### Post date: [2020年八月9日 11:40 UTC](https://meta.discourse.org/t/what-is-reloadable-patch-exactly/160247/1 "2020-08-09T11:40:00Z")

</div>

嘿，

我还在尝试拆解插件，在学习过程中试图覆盖 `TopicsController`，于是搜索了 Discourse 代码仓库，注意到了 `reloadable_patch`。

随后，我在 Discourse 中搜索 `reloadable_patch`，找到了 12 处代码匹配：

> **[Build software better, together](https://github.com/search?p=1&q=org%3Adiscourse+reloadable_patch&type=Code)**
>
> GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

因此，我决定扩大搜索范围，以更好地理解这个迷人的“方法/钩子（？）”，于是我：

- 搜索了整个 GitHub：  
– 所有结果似乎都与 Discourse（插件）相关

- 搜索了网络：  
– 所有结果似乎都与 Discourse（插件）相关

- 搜索了 Meta 论坛：  
– 找到了一些结果，但没有详细解释 `reloadable_patch`（内部机制）的内容。

接下来，我再次搜索了 Discourse 仓库，但未能找到（可能是因为我还不够熟练） `reloadable_patch` 的确切“定义”，即它具体做了什么（或如何定义）。

对于像我这样的 Ruby 新手来说，它似乎是一个“方法”（暂且这么说），或者是一个用于覆盖 Discourse 类的“钩子”；但我找不到定义其内部工作原理的 Ruby 代码。

是否有人愿意向我解释一下，或者指出能说明 `reloadable_patch` 从 Ruby 内部机制角度如何工作的“定义代码”？

谢谢！

希望我不是在自找麻烦才问这个问题！！ 🙂

---

<div class="post-metadata">

### Author: ![fzngagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fzngagan/32/259349_2.png) [@fzngagan](https://meta.discourse.org/u/fzngagan)
#### Post date: [2020年八月9日 12:52 UTC](https://meta.discourse.org/t/what-is-reloadable-patch-exactly/160247/2 "2020-08-09T12:52:16Z")

</div>

> <https://github.com/discourse/discourse/blob/232d277833c5e89aef1569b2167436b53f5747bb/lib/plugin/instance.rb#L861>

它在这里定义。希望这对进一步排查有帮助。

---

<div class="post-metadata">

### Author: ![neounix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/neounix/32/215617_2.png) [@neounix](https://meta.discourse.org/u/neounix)
#### Post date: [2020年八月9日 12:53 UTC](https://meta.discourse.org/t/what-is-reloadable-patch-exactly/160247/3 "2020-08-09T12:53:46Z")

</div>

> [@fzngagan](#):
>
> 这里定义了。希望这能帮助你进一步挖掘。

非常感谢 @fzngagan

不确定为什么用那个 `def` 关键字在仓库中搜索时没有显示该方法；但这正是我要找的东西！

再次感谢！！

编辑：我明白是怎么回事了。我没有深入查看那个 `instance.rb` 文件，只停留在文件顶部；但文件中其实有 23 个 `reloadable_patch` 条目，而 `def` 定义在文件底部。

用引号搜索 “def reloadable\_patch” 找到了它（就在刚才）：)

我开始对 Ruby 上瘾了，正在探索每一个角落。

---

<div class="post-metadata">

### Author: ![fzngagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fzngagan/32/259349_2.png) [@fzngagan](https://meta.discourse.org/u/fzngagan)
#### Post date: [2020年十一月3日 08:59 UTC](https://meta.discourse.org/t/what-is-reloadable-patch-exactly/160247/4 "2020-11-03T08:59:29Z")

</div>

@markvanlan 解释得很清楚

> [@Discourse Plugins and Rails 6 config/initializers Question](https://meta.discourse.org/t/discourse-plugins-and-rails-6-config-initializers-question/168373/20?u=fzngagan):
>
> I guess I have mislead you in posts above. reloadable\_patch is helpful for discourse development, but @david explained it’s use very well: Anything inside the after\_initialize block of plugin.rb is only loaded [during application boot](https://github.com/discourse/discourse/blob/5140ec9acf29df220ec00cc6a704b73773a86bdc/config/application.rb#L342-L342), and not on subsequent reloads. So, assuming you want to add something to the user serializer. The normal behavior would be like: At boot: Discourse loads user\_serializer.rb Discourse loads plugin.rb , which has an override for user\_serializer At reload: …
