【问题标题】:How to optionally exclude gem pg from the Gemfile?如何有选择地从 Gemfile 中排除 gem pg?
【发布时间】:2014-10-16 10:49:02
【问题描述】:

在我们的团队中,有些人没有在他们的机器上安装 pg gem。目前我们使用两个单独的数据库配置,它们被复制到 database.yml。我们在使用这种方法时遇到了问题,因为我们必须在 Gemfile 中不断注释掉 gem pg。所以我尝试在我们的 Gemfile 中进行以下操作:

unless ['host1, 'host2'].include? `hostname`.strip!
  gem 'pg'
end

似乎可行,但老板想要一个更好的解决方案,这样他就可以在笔记本电脑上测试应用程序,而无需安装 Postgres,也无需在 Gemfile 中包含他的主机名。

Gem::Specification.all_names

虽然 'gem list pg --local' 显示它已安装,但不显示 pg 正在安装。

尝试在 Gemfile 中使用 gem list pg --local 不起作用,因为如果您没有安装 pg,系统似乎进入了无限循环。

是否有类似于 'Gem::Specification.all_names' 的内容正确显示已安装 gem 的列表,这些 gem 可用于可选排除 Gemfile 中的 gem。或者有没有更好的方法在上述场景中在不同机器上使用不同的宝石?

注意

if File.open('./config/database.yml').read.each_line.first.index('Postgre').is_a?(Integer)
 gem 'pg'
end

似乎可以工作,但现在我在运行 bundle install 时得到了这个:

Your bundle is complete!
Gems in the group postgres were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

知道它的形成方式吗?

注 2

“未安装组 postgres 中的 Gem”在运行后已修复:rm -r ./.bundle

【问题讨论】:

  • 老板很痛苦 :)。您可以使用dotenv 并添加一个MYAPP_DB_DRIVER 环境变量。
  • 很抱歉刚刚意识到在读取 gem 文件时使用 dotenv 设置的 var 将不可用,您应该手动设置它。
  • 我不介意选择数据库驱动程序。这是通过复制正确的 database.yml 完成的。我想避免与缺少 pg gem 相关的错误。
  • 你可以随心所欲地调用变量,我的意思是你会测试 ENV["USE_POSTGRESS"] 或你的 gemfile 中的任何东西,而不是使用主机名。
  • 您可以在特定的“组”中指定 gem。例如,如果您要在机器上安装特定于生产的 gem,则将 gem 添加到 group :production do gem 'pg' end 下。 Example of a Gemfile

标签: ruby-on-rails postgresql gem rubygems


【解决方案1】:

一种可能的解决方案是使用custom environment 和捆绑器组。

您可能已经注意到config/application.rb 中的这一行:

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

这意味着运行 rails s -e bossmode 需要以下 gem:

group :bossmode do
  # no pg in here...
end

更好的解决方案是说服你的老板KISS 并使用 PG。即使在低端的 macbook air 上,性能成本也很小。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多