RubyMine 6.0.2,带“;调试器“;没有修改Gemfile.lock的gem?

RubyMine 6.0.2,带“;调试器“;没有修改Gemfile.lock的gem?,ruby,gem,rubymine,gemfile,Ruby,Gem,Rubymine,Gemfile,我使用的是RubyMine(v6.0.2),但我的队友不是,所以他们需要gemfile中的“调试器”gem。我可以在运行RubyMine时有条件地取消对Gemfile的要求(这样Gemfile就可以共享和相同),但由于没有包含“调试器”gem,Gemfile.lock文件会根据项目上次是否使用RubyMine运行而变化。这会在冗余Gemfile.lock更改中产生大量噪音 我尝试过使用“调试器xml”gem;这并不能解决问题 那么——我如何运行RubyMine 6.0.2,在Gemfile中使用

我使用的是RubyMine(v6.0.2),但我的队友不是,所以他们需要gemfile中的“调试器”gem。我可以在运行RubyMine时有条件地取消对Gemfile的要求(这样Gemfile就可以共享和相同),但由于没有包含“调试器”gem,Gemfile.lock文件会根据项目上次是否使用RubyMine运行而变化。这会在冗余Gemfile.lock更改中产生大量噪音

我尝试过使用“调试器xml”gem;这并不能解决问题


那么——我如何运行RubyMine 6.0.2,在Gemfile中使用“debugger”gem,而不更改Gemfile.lock

我想我找到了。显然,RubyMine不能很好地处理Rails应用程序中需要的
调试器
gem,但对于刚安装的gem没有任何问题

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

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

以上代码是从,到


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

我一直在从表的另一端处理这个问题。我使用调试器宝石,但有使用RubyMine的队友

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

我在谷歌上搜索了一个更好的解决方案,发现了这样一个帖子:

结合其中的几个答案,我提出了以下解决方案:

  • 从gem文件中删除调试器gem
  • 创建一个包含以下内容的Gemfile.local
  • 如果使用git,则将Gemfile.local添加到.gitignore文件
  • 创建函数和shell别名
  • 使用$
    be rails s启动rails
  • 这一切是如何运作的

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

    shell函数
    \u bundle\u exec\u custom
    将检查CWD中是否有Gemfile.local文件。如果存在,则设置并使用BUNDLE_GEMFILE变量。否则,将使用默认文件

    这将允许开发人员使用他们希望用于本地开发的任何gem,而不必影响整个应用程序

    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'
    
    __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'
    
    函数和shell别名:

    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'
    
    __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'
    

    在我的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?
    
    您可能希望修改
    ,除非
    条件以满足您的需要,但重要的一点是RubyMine将设置
    RM\u INFO
    ,您可以使用它来检测宝石,从而排除需要的宝石

    这将消除RubyMine与命令行绑定的乒乓效应,因此在混合IDE团队中应该可以很好地工作

    最后一点注意,如果要部署到Heroku,可能需要将
    :pry
    组从部署中排除:

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

    我没有太多地使用RubyMine,在使用RubyMine时,有没有理由不希望在GEM文件中包含
    调试器
    ?这仅仅是因为它是多余的,因为您已经有了调试工具,还是它创建了实际冲突?创建了实际冲突。RubyMine使用自己的调试宝石,与“调试器”冲突,并且拒绝运行。取消对gem的限定(使用“除非ENV['RM_INFO']-例如RubyMine签名)会使RubyMine运行,但会更改Gemfile.lock。最近尝试解决此问题,并决定从Gemfile中完全删除调试器。为什么要放在那里?@GilBirman,因为我的队友需要它(他们使用SublimiteText,一个文本编辑器,而不是RubyMine)。这是我正在寻找的方向,但不幸的是,RubyMine似乎在运行时仍然会更改Gemfile.lock,即使没有
    需要
    调试器。在RubyMine内外运行的Gemfile.lock中的
    差异是什么?在使用RubyMine时,它不包括
    调试器
    及其依赖项(pry debugger等),在没有RubyMine的情况下运行时,这些依赖项包括在Gemfile.lock中。我喜欢你的解决方案。谢谢感谢@lime指出RubyMine不介意安装gems。。。这是关键