14

我有一个 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 任务来自动化我当前的设置。

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

4

4 回答 4

13

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

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

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

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

于 2012-05-01T19:33:09.897 回答
4

显然,您可以在 Gemfile 中使用常规 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。诶?

于 2011-09-07T17:41:03.260 回答
0

如果您使用 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']
于 2020-12-28T06:06:28.793 回答
-5

Here is a suggestion which I didn't get to fully work (used for a spree theme and I got problems with some stylesheets from the theme):

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

Duplicate your gemname.gemspec file and call it gemnamedev.gemspec, and change s.name inside it to "gemnamedev".

于 2012-07-12T16:05:17.937 回答