23

当将捆绑器用于一般项目,特别是 Rails 时,您只能访问 Gemfile 中定义的 gem。虽然这是有道理的,但它可能是有限的。大多数情况下,当我想使用团队其他成员不使用的某个 RSpec 格式化程序时,我发现它会受到限制。除非它在 ​​Gemfile 中,否则无法访问。

有什么办法,或者我必须将它添加到 Gemfile?

更新:我的问题不是 Bundler,而是 Spork。在没有 Spork 的情况下运行 RSpec 时,我可以毫无问题地使用我想要的任何格式化程序。

更新 #2:看起来使用 Bundler 仍然是问题的原因。使用 Spork 和不使用 Spork 的区别在于,在不使用 Spork 的情况下运行 RSpec 时,它会在加载项目并进入 Bundler“沙箱”之前加载格式化程序。

使用捆绑器:

$ bundle exec irb
>> require 'fivemat'
LoadError: cannot load such file -- fivemat

from (irb):1:in `require'
from (irb):1
from /Users/arikfr/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'

没有捆绑器:

$ irb
>> require 'fivemat'
=> true
4

6 回答 6

18

ChiliProject 中,我们允许用户创建一个Gemfile.local包含在主Gemfile加载中的内容。这允许用户指定额外的 gem,而无需更改我们Gemfile以简化更新。

为此,我们在 Gemfile 的底部包含了以下代码。

gemfile_local = File.expand_path('Gemfile.local', __dir__)
if File.readable?(gemfile_local)
  puts "Loading #{gemfile_local}..." if $DEBUG
  instance_eval(File.read(gemfile_local))
end

Gemfile.local本身通过.gitignore.

于 2012-09-02T15:56:49.593 回答
13

我认为这些答案都没有被选为正确的,因为它们不能很好地解决问题:拥有可以默认使用的额外 gem不需要对存储库中已有的文件进行任何更改即可实现. 也就是说,您不必修改任何文件,也不必记住不要签入本地更改。这是我的做法。

这个想法基本上是反转 Holger 答案的依赖关系,这样就不需要修改共享的 Gemfile。Bundler 允许指定将哪个文件用作 gemfile,但奇怪的是,文档中的方法显然不适用于其配置文件,并且不会被修复。Bundler 有一个有点模糊的特性,即任何配置选项都可以在环境变量中设置或在命令行中传递。运行所有命令为bundle [command] --gemfile [yourgemfile]BUNDLE_GEMFILE="[yourgemfile]" bundle [command]将导致 Bundler 读取您想要的任何 gemfile。我强烈建议使用环境变量方法,并为当前会话创建别名或导出变量,特别是因为我无法将命令行开关与“exec”命令一起使用。

因此,我像这样运行 rspec: ,并且我在我的 bashrc 中BUNDLE_GEMFILE="[mygemfile]" bundle exec rspec [filename]使用了这个别名的第一部分。bem奇迹般有效。

然后,您应该设置您的源代码管理以忽略您的 Gemfile,无论是在项目的 .gitignore 中,还是为了保持项目完全卫生而不更改其 .gitignore,到您的个人全局忽略文件(默认情况下,~/.config/git/ignore它具有相同的格式为项目的 gitignore 文件)。

需要注意的另一件事是 Bundler 将根据 Gemfile 的名称创建一个锁定文件。这非常方便,因为它可以防止您在签入项目时覆盖项目的 Gemfile.lock,但您也需要忽略这个新的锁定文件。如果您的 gemfile 是Foo.bar,请查找Foo.bar.lock.

最后,您可以在自定义 Gemfile 中执行类似于 Holger 建议的操作:

source "http://rubygems.org"
gem "fivemat"
instance_eval(File.read(File.dirname(__FILE__) + "/Gemfile"))

只要你记得指定你的 Gemfile,你就可以开始了。

于 2013-11-12T22:53:13.817 回答
1

您可以在 Gemfile 中使用类似的内容:

gem 'foo' if ENV['ENABLE_FOO_GEM']

然后只需在您的环境中设置 ENABLE_FOO_GEM 即可。

export ENABLE_FOO_GEM=1

默认情况下,gem 将被禁用,但任何想要使用它的人都可以轻松地(永久地)打开它。

于 2014-04-30T10:28:22.300 回答
1

添加到.gitignore

Gemfile.local
Gemfile.local.lock

将包含以下内容的Gemfile.local.sample文件添加到项目中:

# Include gems that are note meant to be part of the project but for development purposes
# That's why Gemfile.local and Gemfile.local.lock must be git-ignored

# To use these gems:
#   1. Create a "Gemfile.local" file (at same level of "Gemfile")
#   2. Prepend "BUNDLE_GEMFILE=Gemfile.local" before "bundle install" or "bundle exec rails c" and so forth.

eval_gemfile "./Gemfile"

group :development, :test do
  # Suggested gems
  gem "awesome_print", require:"ap"
  gem "hirb"
  gem "pry"
  gem "pry-byebug"
  gem "pry-rails"
  gem "meta_request"

  # My gems
  gem "fivemat"
end
于 2017-12-28T16:51:03.597 回答
0

如果您仍然决定这样做(可怕的想法):

您可以将 ruby​​ 代码添加到 Gemfile 以加载 ~/.gemfile(或类似文件)(如果存在)。

就像是:

eval(IO.read('~/.gemfile'), binding) if FileTest.exists?("~/.gemfile")
于 2012-09-02T15:34:30.670 回答
0

I believe the gem Devpack provides the functionality you are looking for.

The gem allows you to add a single gem to your Gemfile which will permit any developer to configure their own preferred set of development gems either for an individual project or globally by creating a .devpack file containing a list of gems.

(I am the author of this gem; I came across this post while developing it so thought it may be worth adding).

于 2020-07-05T14:36:18.040 回答