【问题标题】:How can Bundler/Gemfile be configured to use different gem sources during development?在开发过程中如何配置 Bundler/Gemfile 以使用不同的 gem 源?
【发布时间】:2011-11-12 08:37:30
【问题描述】:

我有一个 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 并更新 Gemfile 中的 gem 源,这很麻烦。我的工作流程是这样的:

  1. 在开发过程中指向我的本地 gem (gem 'awesome', :path => "~/code/awesome")
  2. 准备好部署后,将 gem 解压到 vendor/gems
  3. 更新 Gemfile 以指向 vendored gem (gem 'awesome', :path => "vendor/gems/awesome-0.0.1")
  4. 运行 bundle install(更新 Gemfile.lock)
  5. 部署代码
  6. 返回步骤 1。

真是麻烦!我想做一些更简洁的事情,而不是简单地编写 Rake 任务来自动化我当前的设置。

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

【问题讨论】:

    标签: ruby rubygems gem bundler gemfile


    【解决方案1】:

    如果您使用 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"]
    

    宝石文件

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

    【讨论】:

      【解决方案2】:

      显然,您可以在 Gemfile 中使用常规 Ruby。根据this article,您可以设置一个环境变量(或我发现的任何其他变量),让您选择要使用的 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。嗯?

      【讨论】:

      • 我尝试了本文之前建议的方法,大部分都可以。问题是,当我部署时, Gemfile.lock 指的是我的本地 gem(参见他的最后两个代码示例)。我想我可以在本地安装生产 gems 然后部署,或者从 git 中完全排除 Gemfile.lock ......但我不确定这些选项中的任何一个都是最好的方法。
      • 是的,我想完成同样的事情,但似乎没有干净的方法可以做到这一点。
      【解决方案3】:

      有一个新功能可以做到这一点,只需指定 local.gem_name 配置选项,例如:

      bundle config local.rack ~/path/to/local/rack
      

      这仅适用于 gem 具有在 Gemfile 中指定的 git repo 和分支的情况。

      有关详细信息,请参阅 Bundler 文档:http://bundler.io/v1.3/bundle_config.html

      【讨论】:

        【解决方案4】:

        这是一个我没有充分发挥作用的建议(用于狂欢主题,我在主题的一些样式表上遇到了问题):

        group :production do
              gem 'gemname', '~> 0.1.6', :git => 'git://github.com/foouser/gemname.git'
        end
        
        group :development do
              gem 'gemnamedev', :path => '~/path/gemname' # use local version
        end
        

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

        【讨论】:

        • 这行不通。 Bundler 给你一个错误,说你不能拥有来自不同来源的两个 gem
        • 你不能在 gemfile 中两次提到一个 gem
        猜你喜欢
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        相关资源
        最近更新 更多