带有“调试器”gem的RubyMine 6.0.2无需修改Gemfile.lock?

时间:2014-01-04 15:57:32

标签: ruby gem rubymine gemfile

我正在使用RubyMine(v6.0.2),但我的队友不是,所以他们需要gemfile中的“debugger”gem。我可以在运行RubyMine时有条件地不需要Gemfile(因此Gemfile可以共享且相同),但由于未包含'debugger'gem,Gemfile.lock文件会根据项目上次使用RubyMine运行还是更改不。这会在冗余的Gemfile.lock更改中产生很多噪音。

我尝试过使用'debugger-xml'gem;但这并没有解决问题。

那么 - 我怎样才能运行RubyMine 6.0.2,使用Gemfile中的'debugger'gem,而不更改Gemfile.lock?

3 个答案:

答案 0 :(得分:6)

我从桌子的另一边一直在研究这个问题。我使用调试器gem,但是有使用RubyMine的队友。

我们讨论了几个可能的解决方案,但它们都涉及Gemfile中的条件检查,这将导致修改后的Gemfile.lock。

我搜索了一个更好的解决方案,发现了这个帖子:How to use gems not in a Gemfile when working with bundler?

结合其中的一些答案,我提出了这个解决方案:

  1. 从Gemfile中删除调试器gem。
  2. 使用以下内容创建Gemfile.local。
  3. 如果使用git。
  4. ,将Gemfile.local添加到.gitignore文件中
  5. 创建一个函数和shell别名。
  6. 使用 $ be rails s
  7. 启动rails

    一切如何运作!

    默认情况下,Bundler将使用名为Gemfile的文件,但可以通过指定BUNDLE_GEMFILE环境变量来覆盖此行为。 Bundler将使用/创建与BUNDLE_GEMFILE同名的锁定文件。

    shell函数__bundle_exec_custom将检查CWD中是否有Gemfile.local文件。如果有,则设置并使用BUNDLE_GEMFILE变量。否则,使用默认的Gemfile。

    这将允许开发人员使用他们想要的任何宝石进行本地开发,而不必影响整个应用程序。

    <强> Gemfile.local:

    source "https://rubygems.org"
    
    gemfile = File.join(File.dirname(__FILE__), 'Gemfile')
    if File.readable?(gemfile)
      puts "Loading #{gemfile}..." if $DEBUG
      instance_eval(File.read(gemfile))
    end
    
    gem 'debugger'
    

    功能和shell别名:

    __bundle_exec_custom () {
      if [ -f Gemfile.local ]
      then
        BUNDLE_GEMFILE="Gemfile.local" bundle exec $@
      else
        bundle exec $@
      fi
    }
    
    # Rails aliases
    alias be='__bundle_exec_custom'
    

答案 1 :(得分:3)

我想我找到了它。显然,RubyMine不能很好地处理Rails应用程序中所需的debugger gem,但是刚刚安装的gem没有问题。

然后解决方案是将gem包含在Gemfile(和Gemfile.lock)中,但只包含require在RubyMine之外

gem 'debugger', {group: [:test, :development]}.
    merge(ENV['RM_INFO'] ? {require: false} : {})

以上代码来自this comment on the JetBrains bug trackerthis comment on a similar question

它检查是否存在由RubyMine设置的RM_INFO环境变量。重要的是它只会影响gem是required,因此不应该在安装之间更改Gemfile.lock。

答案 2 :(得分:2)

我可能有一个更好的解决方案,似乎在我的Rails 4应用程序中为我工作...

在Gemfile中,将所有与调试相关的gem移动到他们自己的组中,如下所示:

group :pry do
  gem 'pry', '>= 0.10.0'
  gem 'pry-debugger', '>= 0.2.3'
  gem 'pry-highlight', '>= 0.0.1'
end

config/application.rb中,您会找到类似以下内容的内容:

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

在下面添加以下内容:

Bundler.require(:pry) unless ENV['RM_INFO'] || Rails.env.production?

您可能希望修改unless条件以满足您的需求,但重要的是RubyMine将设置RM_INFO,您可以使用它来检测,从而将宝石排除在外。< / p>

这将消除RubyMine与命令行捆绑的乒乓效应,因此这应该适用于混合IDE团队。

最后一点,如果您要部署到Heroku,您可能希望排除在部署时安装:pry组:

 $ heroku config:set BUNDLE_WITHOUT="development:test:pry"