ruby 为什么捆绑包安装在供应商/捆绑包中安装gem?

zzwlnbp8  于 2022-11-04  发布在  Ruby
关注(0)|答案(7)|浏览(219)

每当我执行bundle install时,所有的gem都会安装在

app_dir/vendor/bundle

路径和消耗负载的磁盘空间。我还尝试安装gem的地方,它应该得到安装iidoe gemsets,而开发通过以下方式:

bundle install --no-deployement

但这对我不起作用,我在vendor/bundle安装gem。我如何使它在所有应用程序中全局安装或在ruby gemsets位置安装?我也尝试删除.bundle/config,但没有任何变化。
我正在使用:

rvm version: 1.23.14
ruby version: 2.0.0-p247
rails 3.2.13

下面是我的~/.bash_profile

export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
eval "$(rbenv init -)"
alias pg='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log'

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

我的~/.bashrc

PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting

您可能需要的其他信息:

aman@Amandeeps-MacBook-Pro ~/Projects/qe (develop)*$ which bundle
/Users/aman/.rvm/gems/ruby-2.0.0-p247@global/bin/bundle

aman@Amandeeps-MacBook-Pro ~/Projects/qe (develop)*$ rbenv which bundle
/Users/aman/.rbenv/versions/2.0.0-p247/bin/bundle

amandeep@Amandeeps-MacBook-Pro ~/Projects/qe (develop)*$ rbenv which ruby
/Users/aman/.rbenv/versions/2.0.0-p247/bin/ruby

aman@Amandeeps-MacBook-Pro ~/Projects/qe (develop)*$ rbenv gemset active
rbenv: NO such command `gemset'

aman@Amandeeps-MacBook-Pro ~/Projects/qe (develop)*$ which rails
/Users/aman/.rvm/gems/ruby-2.0.0-p247@global/bin/rails

我也试过了,但没什么用:

bundle install --system

和删除.bundle目录。
请帮助我在gemsets中安装宝石,而不是vendor/bundle或默认位置。

s2j5cfk0

s2j5cfk01#

在您的项目文件夹中,您将拥有.bundle目录,其中包含bundler的配置。尝试删除该文件夹。它应该会将gem的安装路径重置回系统范围设置。
如果你只想编辑安装路径,用你喜欢的编辑器打开.bundle/config应该会显示vendor/bundle的路径。删除该行会将其恢复为默认值,而不会删除你可能拥有的其他配置。
此外,另一种不太常见的情况是你的系统设置被搞砸了。
我不得不从我的主文件夹(rm -rf ~/.bundle)中删除.bundle。你可以检查你的配置运行bundle env

zvms9eto

zvms9eto2#

请尝试使用安装

bundle install --system

我认为最初的bundle安装是使用--path标志运行的,bundler现在记住了该配置。
来自Bundler手册页
某些选项在调用捆绑包安装和Bundler运行时之间被记住。
随后调用bundle install会将gem安装到最初传递给 --path 的目录中。Bundler运行时将在该位置查找gem。可以通过运行 bundle install --system 恢复此选项。

EDIT:正如下面的注解所提到的,这将在系统范围内安装gems。如果你正在使用rvm等来管理不同应用的环境,请检查@IuriG上面提到的答案。

j0pj023g

j0pj023g3#

1.使用bundle env查看路径和捆绑包配置
1.之后,将bundle路径设置为~/.rvm/gems/ruby-2.0.0-p247,如下所示:

bundle install --path ~/.rvm/gems/ruby-2.0.0-p247

该路径是全局路径,您还可以使用自己的自定义路径。
1.发布此bundle install将永远不再需要path,并将始终安装您所有的宝石在该directory(~/.rvm/gems/ruby-2.0.0-p247 in my case)为该应用程序不在app_folder/vendor/bundle

ig9co6j1

ig9co6j14#

尝试运行bundle env。这将告诉您路径配置的设置位置。

mwg9r5ms

mwg9r5ms5#

首先,根据你的信息,似乎你已经安装了rvm和rbenv。这是一个非常糟糕的主意。你必须删除其中一个(rbenv + bundler对我来说就像一个魅力,没有尝试rvm)。
关于你的问题,在你的项目中检查.bundle/config,因为该项目的bundle的所有配置都在那里(如果它仍然被删除,你可以创建一个新的)。你可能想添加这行(或者改变它,如果它已经在那里):BUNDLE_DISABLE_SHARED_GEMS: '0'用于共享宝石,他们去你的BUNDLE_PATH:设置的地方(BUNDLE_PATH: vendor在我的情况下)。
有关全局配置文件,请在~/.bundle/config中查找
此外,以下手册页也可能用途:bundle config

7tofc5zh

7tofc5zh6#

要在系统范围内安装Gem,避开路径vendor/bundle,只需在项目目录中运行以下命令

bundle install --system
2sbarzqh

2sbarzqh7#

$ brew install rbenv
$ rbenv install 2.7.6
$ rbenv install -l
2.7.6
$ rbenv global 2.7.6
$ gem install bundler
$ brew install rbenv-gemset
$ rbenv gemset create 2.7.6 mygemset
$ gem env home
/Users/myuser/.rbenv/versions/2.7.6/gemsets/mygemset
$ gem install rails
$ rails new myapp && cd myapp
$ bundle install
$ bundle show --paths
/Users/myuser/.rbenv/versions/2.7.6/gemsets/myapp/gems/actioncable-7.0.1
...
$ bundle config set --local path 'vendor/bundle'
$ file .bundle
$ .bundle: directory
$ cat .bundle/config
---
BUNDLE_PATH: "vendor/bundle"
$ bundle install # Note from time to time you will get some bizarre error "Could not find timeout-0.2.0 in any of the sources". Simply delete Gemfile.lock and run bundle install again.
$ bundle show --paths
/Users/myuser/myapp/vendor/bundle/ruby/2.7.0/gems/actioncable-7.0.4
$ bundle config set --local system 'true' # or you may want to   delete BUNDLE_PATH: "vendor/bundle" from .bundle/config
$ rm -rf vendor/bundle
$ rbenv gemset active
mygemset global
$ bundle install
$ bundle show --paths
/Users/myuser/.rbenv/versions/2.7.6/gemsets/mygemset

总而言之,当你安装一个ruby版本管理器时,比如rbenv,它会根据它的设置来安装gem。但是,如果你在你的项目中更新.config/bundle以使用'vendor/bundle',那么'bundle install'就会在那里安装gem。有时候这是用来保存项目特定的gem,而不是使用gemset工具,比如rbenv-gemset。其他时候它是部署所必需的。例如部署到AWS Lambda的ruby2.7运行时。如上所示,通过从.config/bundle中删除“vendor/bundle”的引用,可以轻松删除“vendor/bundle”的使用。删除后,它将默认为全局存在的gem环境,在上述情况下,gem环境由rbenv管理。

相关问题