Ruby 如何配置Bundler/Gemfile以在开发期间使用不同的gem源?

Ruby 如何配置Bundler/Gemfile以在开发期间使用不同的gem源?,ruby,rubygems,gem,bundler,gemfile,Ruby,Rubygems,Gem,Bundler,Gemfile,我有一个Sinatra应用程序,需要另一个我正在本地开发的gem。我在配置Bundler以在开发过程中使用我的本地gem代码时遇到问题,但在生产过程中使用了我的供应商gem代码 理想情况下,我可以这样做,但Bundler不允许您两次指定同一个gem: # Doesn't work: group :development do gem 'awesome', :path => "~/code/awesome" end group :production do gem 'awesome

我有一个Sinatra应用程序,需要另一个我正在本地开发的gem。我在配置Bundler以在开发过程中使用我的本地gem代码时遇到问题,但在生产过程中使用了我的供应商gem代码

理想情况下,我可以这样做,但Bundler不允许您两次指定同一个gem:

# Doesn't work:
group :development do
  gem 'awesome', :path => "~/code/awesome"
end

group :production do
  gem 'awesome', :path => "vendor/gems/awesome-0.0.1"
end
与此同时,我已经求助于手动销售gem&每次部署时都更新gem文件中的gem源代码,这相当麻烦。我的工作流程如下:

  • 在开发过程中指向我的本地gem(
    gem'awesome',:path=>“~/code/awesome”
  • 准备部署时,将gem解包到
    vendor/gems
  • 更新Gemfile以指向供应商的gem(
    gem'awesome',:path=>“vendor/gems/awesome-0.0.1”
  • 运行bundle安装(更新Gemfile.lock)
  • 部署代码
  • 返回到步骤1
  • 真麻烦!我想做一些更简洁的事情,而不是简单地编写Rake任务来自动化我当前的设置


    这个场景的最佳工作流是什么?

    显然,您可以在文件中使用常规Ruby。根据需要,您可以设置一个环境变量(或者我发现的任何其他变量),让您选择要使用哪个版本的gem

    ## based on an ENV variable
    if ENV['RACK_ENV'] == "development"
      gem 'awesome', :path => "~/code/awesome"
    else
      gem 'awesome', :path => "vendor/gems/awesome-0.0.1"
    end
    

    也许这样行。如果你需要出售你正在进行的gem,也许你可以制作一个小脚本来设置ENV,出售它,并重置ENV。呃?

    有一个新功能允许这样做,只需指定
    local.gem\u name
    config选项,例如:

    bundle config local.rack ~/path/to/local/rack
    
    只有当gem文件中指定了git repo和分支时,这才有效


    有关更多详细信息,请参阅thr Bundler文档:

    这里有一个建议,我没有充分发挥作用(用于spree主题,我在该主题的一些样式表中遇到了问题):


    复制gemname.gempec文件并将其命名为gemnamedev.gempec,并将其中的s.name更改为“gemnamedev”。

    如果您使用docker构建容器,则始终可以将路径设置为dockerfile中的环境变量,并在Gemfile中使用此环境变量。请在下面找到Dockerfile和Gemfile的示例

    Dockerfile

    ARG tenant
    ENV mgm=3
    ENV GEMBOX_URL='abc.com:9292'
    WORKDIR /app
    COPY Gemfile* ./
    RUN bundle install --without development test
    COPY . .
    ENTRYPOINT ["entrypoint.sh"]
    CMD ["crond", "-f"]
    
    Gemfile

    source 'https://rubygems.org/'
    source ENV['GEMBOX_URL']
    gem 'jwt'
    gem 'activerecord-import'
    gem 'wicked_pdf' 
    gem 'wkhtmltopdf-binary-edge', '~> 0.12.5.0'
    gem 'zgear', '~> 0.6.4.1', source: ENV['GEMBOX_URL']
    gem "piston", '~> 1.3.1', source: ENV['GEMBOX_URL']
    gem 'communication_connector', '~> 0.1.4', source: ENV['GEMBOX_URL']
    gem 'health_check', source: ENV['GEMBOX_URL']
    

    我尝试了这篇文章早些时候的建议,大部分情况下都没问题。问题是,当我部署时,Gemfile.lock引用了我的本地gem(参见他最后的两个代码示例)。我想我可以在本地安装生产gems&然后部署,或者完全从git中排除Gemfile.lock。。。但我不确定这两个选项是否是最好的方法。是的,我想完成同样的事情,但似乎没有干净的方法来做到这一点。这是行不通的。Bundler会给你一个错误,告诉你不能有两个来自不同来源的gem,你不能在gem文件中两次提到一个gem
    source 'https://rubygems.org/'
    source ENV['GEMBOX_URL']
    gem 'jwt'
    gem 'activerecord-import'
    gem 'wicked_pdf' 
    gem 'wkhtmltopdf-binary-edge', '~> 0.12.5.0'
    gem 'zgear', '~> 0.6.4.1', source: ENV['GEMBOX_URL']
    gem "piston", '~> 1.3.1', source: ENV['GEMBOX_URL']
    gem 'communication_connector', '~> 0.1.4', source: ENV['GEMBOX_URL']
    gem 'health_check', source: ENV['GEMBOX_URL']