Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails可选gem配置_Ruby On Rails_Rubygems - Fatal编程技术网

Ruby on rails Rails可选gem配置

Ruby on rails Rails可选gem配置,ruby-on-rails,rubygems,Ruby On Rails,Rubygems,当您想使用gem进行开发/测试,而不想强迫其他开发人员使用时,您会怎么做?现在我有 begin require 'redgreen' rescue LoadError end 在test\u helper.rb中,没有gem配置,但这似乎是一种笨拙的方法,尽管是一种功能性方法。我想做如下事情: config.gem "redgreen", :optional => true 还有其他建议吗?还是我应该把那些表面上的宝石卖掉 编辑 要明确的是,我只讨论那些特定的gem,比如redgr

当您想使用gem进行开发/测试,而不想强迫其他开发人员使用时,您会怎么做?现在我有

begin
  require 'redgreen'
rescue LoadError
end
test\u helper.rb中,没有gem配置,但这似乎是一种笨拙的方法,尽管是一种功能性方法。我想做如下事情:

config.gem "redgreen", :optional => true
还有其他建议吗?还是我应该把那些表面上的宝石卖掉

编辑


要明确的是,我只讨论那些特定的gem,比如redgreen,它们实际上并没有在函数代码中使用,而只是在编码过程中使用。除了避免有条件的要求外,根本不需要提供这些工具。

如果您希望它是可选的,最好将gem冻结为插件。然而,与开发团队的其他成员相比,使用不同的gem不是一个好主意,因为它会在代码库中产生一些不一致的地方,以后可能很难找到这些地方。我会说将其添加到config.gem,然后告诉其他开发人员执行以下操作:

rake gems:install

您已经完成了。

这就是我在Rails 3.1中解决相同问题的方法。在我的文件中:

if File.exists? './tmp/eric_dev_gems'
  gem 'redgreen'
  gem 'awesome_print'
  gem 'wirble'
  gem 'wirb'
  gem 'hirb'
end

在您选择的
/tmp/
(或.gitignore中的某个文件夹)中创建一个文件。我使用了
eric\u dev\u gems
。git应该忽略该文件,它只会存在于您的系统中,除非您的一个队友决定他也要创建该文件。

好的,我想我已经想出了一些办法。基本上,这个想法是在Rails应用程序执行时只执行辅助文件。为此,我们增加了两件事:

首先,我们稍微修改一下rails脚本:

# in ./script/rails

Kernel::IN_RAILS_APP = true

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'
第二,如果我们在rails应用程序中,并且存在一个辅助文件,我们告诉bundler拉入辅助文件:

# Gemfile

if Kernel.const_defined?(:IN_RAILS_APP)
  local_gemfile = File.dirname(__FILE__) + "/Gemfile.local"
  if File.exists?(local_gemfile)
    puts 'using local gemfile'
    self.instance_eval(Bundler.read_file(local_gemfile))
  end
end
现在,您可以将
Gemfile.local
添加到项目中,并在每台机器上运行特定的gems<代码>捆绑安装
正常工作,因为应用程序中的
常量不存在


**确保将Gemfile.local添加到.gitignore中。

在我看来,这就是环境的用途。幸运的是,还提供了一种方法来处理GEM文件中的内容,这也是rails使用它的方式:组

与rails使用环境的方式基本相同。以下是您可以在GEM文件中找到的内容:

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end
下面是您可以在config/application.rb中找到的内容

Bundler.require(:default, Rails.env) if defined?(Bundler) 
您所需要做的就是更改本地环境设置,除非其他与您一起工作的人决定更改,否则不会受到影响。每件事都得到承诺,没有任何损失

以下是一些链接:
http://gembundler.com/groups.html

特定于您的开发环境的Gems应该安装在您的gemset或本地Gems中,而不是安装在
Gemfile

一个典型的例子是ruby-debug-base19x,Rubymine需要它进行调试。这是安装在您的本地gemset中,但不是安装在
Gemfile
中,因为并非所有的编码器都使用Rubymine

[编辑]

事实上,一切都是在包的上下文中运行的,外部gem是不可访问的。确实存在一些变通办法。大部分都是脏的:)

我在这方面找到了很多好的解决办法

最好的解决方案是将其添加到
.irbrc

# Add all gems in the global gemset to the $LOAD_PATH so they can be used even
# in places like 'rails console'. 
if defined?(::Bundler)   
  global_gemset = ENV['GEM_PATH'].split(':').grep(/ruby.*@global/).first 
  if global_gemset
    all_global_gem_paths = Dir.glob("#{global_gemset}/gems/*")
    all_global_gem_paths.each do |p|
      gem_path = "#{p}/lib"
      $LOAD_PATH << gem_path
    end   
  end 
end

require 'irb/completion' 
require 'rubygems' 
require 'wirble'

Wirble.init 
Wirble.colorize
#将全局gems集中的所有gems添加到$LOAD_路径,以便它们甚至可以使用
#在“rails控制台”之类的地方。
如果已定义?(::绑定器)
global_gemset=ENV['GEM_PATH'].split(':').grep(/ruby.*@global/).first
如果全局_gemset
all_global_gem_path=Dir.glob(“#{global_gemset}/gems/*”)
所有_全局_gem _路径。每个路径都有| p|
gem_path=“#{p}/lib”

$LOAD_PATH我在这里回答了我自己的一个类似问题

一种方法是创建不同的环境:

group :scott do 
end
然后


我把它放在我的gem文件中解决了:

$gem_names ||= ENV['GEM_PATH'].split(':').map{|g| Dir.glob("#{g}/gems/*").map{|p|p.split('/gems/').last}}.flatten

gem 'redgreen' if $gem_names.any?{|n| n=~/redgreen/ }
这样,只有在系统上手动安装gem时,才会使用gem

这很好,但有一个缺点,就是它将gem名称放在Gemfile.lock中。这没有什么影响,因为gem不是通过
bundle install
安装的,但它确实会使锁文件有点凌乱,并且会导致锁文件从一个开发人员更改到下一个开发人员

如果这对您来说是一个问题,另一个选择是保持gem文件干净,并要求gem具有完整的路径,或者您可以只为该gem添加路径。像这样:

$gem_paths ||= ENV['GEM_PATH'].split(':').map{|g| Dir.glob("#{g}/gems/*")}.flatten
$gem_paths.grep(/redgreen/).each {|p|$LOAD_PATH << p+'/lib'}
require 'redgreen' rescue nil
$gem|u PATH |=ENV['gem|u PATH'].split(':').map{{g| Dir.glob(“{g}/gems/*”)}.flant

$gem_path.grep(/redgreen/)。每个{| p |$LOAD| PATH如何使用redgreen导致代码库中的不一致?我真的只是在考虑基准测试、输出糖等,而不是编码工具。显然,您使用的代码应该是特定的和/或冻结的。我认为无论您使用什么gem,整个开发团队都应该拥有相同的套件,以确保bug和问题是一致的跨平台。例如,我在一个项目中使用了Newrelic RPM,它导致了其他人都没有遇到的错误。考虑到gems需要与bundlerI一起工作,我真的不明白这是一个解决方案。我发现这种方法很烦人,因为我的Gemfile.lock总是与同事不同。还有一个问题:当我们在部署到Heroku之前,由于Gemfile.lock的差异,我无法推送我的更改。在这种情况下,我只是重命名了文件,运行了
bundle install
,然后推送(并重新命名了文件)。可以为我制作一个脚本来完成此操作,但我会寻找一个更干净的解决方案。为什么要在Gemfile中列出
wirble、wirb、hirb、
?为什么不直接在本地或gemset中安装它们?对代码没有依赖性,它只是您的(而且只是您的)需要它们的开发机器。我尝试将它们安装到gemset。它们不可用于
rails服务器
rails控制台
,因为它们都是用bundle exec执行的——如果我错了,请纠正我,尽管如此,Gemfile inspirat
$gem_paths ||= ENV['GEM_PATH'].split(':').map{|g| Dir.glob("#{g}/gems/*")}.flatten
$gem_paths.grep(/redgreen/).each {|p|$LOAD_PATH << p+'/lib'}
require 'redgreen' rescue nil