【问题标题】:Get Unicorn to only access vendor/cache gems让 Unicorn 仅访问供应商/缓存 gem
【发布时间】:2013-03-22 01:48:20
【问题描述】:

似乎当我运行bundle package 然后bundle install --local 然后我运行unicorn_rails 时,独角兽仍在访问系统宝石。我不断得到:

你已经激活 rack 1.5.2,但是你的 Gemfile 需要 rack 1.2.8。使用 bundle exec 可以解决这个问题。

这不应该是因为机架 1.2.8 在供应商/缓存中。

那么如何让 unicorn 让捆绑环境仅使用供应商/缓存 gem?

【问题讨论】:

    标签: ruby-on-rails bundler unicorn


    【解决方案1】:

    bundle install --localvendor/local 中获取gem,并使用默认的gem 命令安装它们。默认情况下,这是系统范围的安装。如果您使用的是 RVM 或其他东西,它将在您当前的 RVM gemset 中。

    如果您要在生产环境中安装,并且希望将应用程序限制为来自 vendor/local 的 gem,则可以使用 bundle install --deployment。这会将 gem 安装到 vendor/bundle 并设置 Bundler 以使用这些 gem(并且只有那些 gem,而不是系统的)。如果 gem 不在 vendor/local 中,它将下载它们。它不会更新您的 Gemfile.lock,最佳做法是让您在 vendor/cache 中的所有 gem 保持最新状态,以防止它尝试下载 gem。

    您不需要使用bundle exec,除非您从其中一个 gem 运行二进制文件。如果您正在运行rails server 并遇到此问题,原因是rails 命令是从shell 的$PATH 运行的。它可能是与您想要使用的版本不同的 Rails 版本。

    如果是这种情况,您的选择是追踪到您想要的rails 版本的路径并显式运行它,使用bundle exec,或运行bundle install --binstubs --deployment 并添加 em> bin 目录到您的 PATH。我没有注意到来自bundle exec 的任何开销,但如果您对此感到担忧并且仍然希望将所有内容都限制在您的包中,那么请使用--binstubs(顺便说一下,Heroku 就是这样做的)。

    【讨论】:

    • 后续说明:rails 在这种情况下不再是问题,因为它现在只运行script/rails(如果存在),这将是 Bundle 范围的。关于二进制路径的所有其他内容仍然适用于其他 gem(rspec 是一个值得注意的)。如果您正在运行 unicornforemanguardspork 或任何其他 Ruby gem 二进制文件,则需要解决路径问题。
    • 感谢@吉米·斯图尔特!我真的很想把我所有的宝石都保存在我的存储库中。我有另一个 Rails 应用程序正在运行(Redmine),似乎冲突总是在发生。此外,我不想依赖 ruby​​gems.org 始终存在或始终可用,在某些情况下是 github gems。 bundle install --binstubs --deployment 或 bundle install --deployment 是制作“自包含”应用程序的最佳方式吗?如果是这样,如果 gem 现在位于 vendor/bundle 中,那么缓存目录的用途是什么?
    • bundle install --binstubs --local --deployment 是你想要的。在您的项目中创建 binstubs,阻止下载 gem,将 gem 安装到 vendor/bundle,并且只使用这些 gem。 vendor/cache 目录包含 Gem 源代码.gem 文件)。 vendor/bundle 目录充满了解压、编译(如果需要)、即用型的 gem。这是 require 在您的应用运行时最终加载它们的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多