【问题标题】:How can i remove part of code from gem如何从 gem 中删除部分代码
【发布时间】:2016-10-09 18:46:40
【问题描述】:

我使用 gem money 它在我的本地机器上工作正常,但是当我尝试在我的生产服务器上部署时,我收到错误 Could not find sixarm_ruby_unaccent-1.1.1 它对 money gem 的依赖

我尝试在生产服务器上手动安装它,但遇到了同样的错误。

所以我决定从 gem 中删除这部分代码。

但是如何正确地做呢?

只需从 gem 中删除此代码或我应该怎么做?

lib/Money.rb

require "bigdecimal"
require "bigdecimal/util"
require "set"
require "i18n"
require "sixarm_ruby_unaccent"
require "money/currency"
require "money/money"

# Overwrites unaccent method of sixarm_ruby_unaccent.
class String
  def unaccent
    accentmap = ACCENTMAP
    accentmap.delete("\u{0142}") # Delete ł symbol from ACCENTMAP used in PLN currency
    accentmap.delete("\u{010D}") # Delete č symbol from ACCENTMAP used in CZK currency
    accentmap.delete("\u{FDFC}") # Delete ﷼ symbol from ACCENTMAP used in IRR, SAR and YER currencies
    accentmap.delete("\u{20A8}") # Delete ₨ symbol from ACCENTMAP used in INR, LKR, MUR, NPR, PKR and SCR currencies
    split(//u).map {|c| accentmap[c] || c }.join("")
  end
end

我需要删除 require "sixarm_ruby_unaccent"unaccentmethod

【问题讨论】:

  • 我认为这是错误的方法,除非您愿意重新编写然后猴子修补部分 gem。您应该调查为什么问题发生在您的服务器上,而不是因为无法安装 gem 而改变它的工作方式。
  • @lcguida。好的,我怎样才能猴子补丁宝石?
  • 好吧,我想建议你不要这样做。您需要了解 gem 才能执行此操作,并确保不会破坏其他内容,并且要知道 gem 中的任何未来更改可能与您正在更改的代码不兼容。
  • 特别是知道sixarm_ruby_unaccent是用纯Ruby编写的,安装它听起来最合乎逻辑。
  • @MladenJablanović 我已将其添加到我的 gemfile 中,也已将其安装到生产服务器

标签: ruby-on-rails ruby rubygems monkeypatching


【解决方案1】:

我想删除该行可能会给您的应用程序带来另一个错误。我很想知道它首先做什么。但是,您是否尝试再次删除您的Gemfile.lockbundle install?但是,如果您想继续,最好gem 'money', require: false 然后在初始化程序中,或者在您的 lib/money.rb 中

require "bigdecimal"
require "bigdecimal/util"
require "set"
require "i18n"
require "money/currency"
require "money/money"

将 lib 目录添加到您的 autoload_path 中,您应该一切顺利。 但是,我认为更好的方法是首先查找导致错误的原因,而不是将此错误引入您的应用程序

【讨论】: