每个用户或每个项目的 gem 缓存路径

问题描述 投票:0回答:1

尝试打包我的 Ruby 应用程序,我收到很多这样的错误:

Bundler::PermissionError There was an error while trying to write
to `/opt/ruby/lib/ruby/gems/3.3.0/cache/nio4r-2.7.1.gem`. It is
likely that you need to grant write permissions for that path.

...这并不奇怪,我自己从我的用户帐户中删除了权限。也许 ruby 开发的想法不同,但老实说,我发现所有用户可写 gem 缓存路径的想法很搞笑。

如何使用自己的 gem 缓存路径来处理所有内容? (包括

bundle package
,所以
bundle install --local
是不行的)。注意,this问题正在询问一些不同的问题(OP想要使用本地目录作为gem缓存,我想在另一个地方使用系统gem目录,无论如何,那里写的答案都不适合我,我仍然收到这些错误) .

我最想要的:这将类似于项目本地

node_modules
目录在 Node.js 世界中所做的事情。因此,所有依赖项都会下载到本地项目目录中,安装它们中的任何一个都不需要 root 权限。

ruby rubygems bundler
1个回答
0
投票

令人惊讶的是,解决方案是:

  1. BUNDLE_CACHE_PATH
    环境变量是
    bundle
    将保留其缓存的位置。
  2. 还需要
    GEM_HOME
    来确定
    gem
    将在何处保留其单独的缓存(以另一种格式)。
  3. 在打包应用程序时,bundler 会调用 gem,但是这些都有独立的缓存目录,只有 ruby 开发人员知道,为什么。
  4. 替代
    bundle install
    ,首选方法是使用
    bundle package
    。这会将文件打包到
    BUNDLE_CACHE_PATH
    中,而不是本地系统范围内的、通常为只读的目录中。

“宝石”和“捆绑”的关系还不清楚。清楚的是:

普通的包管理器(如 Java 中的 mvn 或 Node.js 中的 npm)是使用 Ruby 中的 3 个工具完成的:

  • Gem 与单独的 Gem 一起玩(gem 是 ruby 包)
  • 如果 Gem 依赖图中需要导航,Bundle 就会播放
  • Rake 是一个类似于 GNU Make(或“npm run”或“maven-exec-plugin”)的工具。这就是基于配方的脚本执行。

Gem 和 Bundle 之间的功能冲突显然是整个 Ruby 世界的一个缺点,这些都应该是相同的(或者它们应该有非常明确的区分和记录良好的职责)。

© www.soinside.com 2019 - 2024. All rights reserved.