猴子修补时将代码放在哪里
Where to put code when monkey patching
我读到的关于猴子补丁的所有内容都说要做这样的事情:
class String
def foo
#your special code
end
end
但我找不到关于将此代码放在哪里的任何说明。在 rails 应用程序中,我可以把它放在我想要的任何疯狂的地方吗?在模块中?一个模型?
我是否需要在定义 monkeypatch 的文件中包含一些内容?我需要在任何我想使用它的地方包含我的 monkeypatch 吗?
这个没有固定规则。从技术上讲,您可以在任何地方打开它(class;并添加您的方法)。我通常会制作一个名为 monkey_patches.rb
的特殊文件,并将其放在 config/initializers
或我的 Rails 应用程序的 misc
文件夹中,这样如果出现冲突我就知道去哪里查找。
另外,我建议使用 Module
来包裹猴子补丁。查看 3 ways to monkey patch without making a mess 了解更多信息。
他的例子:
module CoreExtensions
module DateTime
module BusinessDays
def weekday?
!sunday? && !saturday?
end
end
end
end
DateTime.include CoreExtensions::DateTime::BusinessDays
我使用了 Justin Weiss 在 3 Ways to Monkey-Patch Without Making a Mess
中描述的以下技术
例如,在 vanilla Ruby 中,gem,您在需要的某个文件中定义一个模块,然后 include
(or extend
) 将模块放入所需的 class .
module StringMonkeypatch
def foo
#your special code
end
end
String.include StringMonkeypatch
在 Rails 中时,您可能希望在自动加载的地方定义模块(查找 autoload_paths
)并遵循 Rails 的命名约定。
例如,如果 monkeypatching Sidekiq::Testing
gem class 你应该镜像文件结构。
# in /app/<something telling>/sidekiq/testing/monkeypatch.rb
module Sidekiq::Testing::Monkeypatch
def foo
#your special code
end
end
# in /config/environment.rb, at the bootom
Sidekiq::Testing.include Sidekiq::Testing::Monkeypatch
只是插话,因为我花了很长时间才弄清楚这个问题,因为很少有解决方案奏效。
• 我不得不使用普通的旧要求。我把它放在 config/application.rb
文件中。如果您像某些人建议的那样将文件放在应用程序目录中,该文件不会自动为我加载。不知道为什么。
patching_file_path = File.expand_path("./lib", Dir.pwd)
Dir[patching_file_path+'/*.rb'].each {|file| require file }
• 我还在尝试请求的文件中放置了一个临时文件 puts "I'm Working!
,这样我就可以检查控制台以查看它是否正在加载。
• 此外,如果您正在使用 spring 加载程序,则在启动控制台之前,您应该在启动 rails 控制台之前在终端中执行 bin/spring stop
。否则,它不会加载新文件。
我读到的关于猴子补丁的所有内容都说要做这样的事情:
class String
def foo
#your special code
end
end
但我找不到关于将此代码放在哪里的任何说明。在 rails 应用程序中,我可以把它放在我想要的任何疯狂的地方吗?在模块中?一个模型?
我是否需要在定义 monkeypatch 的文件中包含一些内容?我需要在任何我想使用它的地方包含我的 monkeypatch 吗?
这个没有固定规则。从技术上讲,您可以在任何地方打开它(class;并添加您的方法)。我通常会制作一个名为 monkey_patches.rb
的特殊文件,并将其放在 config/initializers
或我的 Rails 应用程序的 misc
文件夹中,这样如果出现冲突我就知道去哪里查找。
另外,我建议使用 Module
来包裹猴子补丁。查看 3 ways to monkey patch without making a mess 了解更多信息。
他的例子:
module CoreExtensions
module DateTime
module BusinessDays
def weekday?
!sunday? && !saturday?
end
end
end
end
DateTime.include CoreExtensions::DateTime::BusinessDays
我使用了 Justin Weiss 在 3 Ways to Monkey-Patch Without Making a Mess
中描述的以下技术例如,在 vanilla Ruby 中,gem,您在需要的某个文件中定义一个模块,然后 include
(or extend
) 将模块放入所需的 class .
module StringMonkeypatch
def foo
#your special code
end
end
String.include StringMonkeypatch
在 Rails 中时,您可能希望在自动加载的地方定义模块(查找 autoload_paths
)并遵循 Rails 的命名约定。
例如,如果 monkeypatching Sidekiq::Testing
gem class 你应该镜像文件结构。
# in /app/<something telling>/sidekiq/testing/monkeypatch.rb
module Sidekiq::Testing::Monkeypatch
def foo
#your special code
end
end
# in /config/environment.rb, at the bootom
Sidekiq::Testing.include Sidekiq::Testing::Monkeypatch
只是插话,因为我花了很长时间才弄清楚这个问题,因为很少有解决方案奏效。
• 我不得不使用普通的旧要求。我把它放在 config/application.rb
文件中。如果您像某些人建议的那样将文件放在应用程序目录中,该文件不会自动为我加载。不知道为什么。
patching_file_path = File.expand_path("./lib", Dir.pwd)
Dir[patching_file_path+'/*.rb'].each {|file| require file }
• 我还在尝试请求的文件中放置了一个临时文件 puts "I'm Working!
,这样我就可以检查控制台以查看它是否正在加载。
• 此外,如果您正在使用 spring 加载程序,则在启动控制台之前,您应该在启动 rails 控制台之前在终端中执行 bin/spring stop
。否则,它不会加载新文件。