尝试打包我的 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 权限。
令人惊讶的是,解决方案是:
BUNDLE_CACHE_PATH
环境变量是 bundle
将保留其缓存的位置。GEM_HOME
来确定 gem
将在何处保留其单独的缓存(以另一种格式)。bundle install
,首选方法是使用 bundle package
。这会将文件打包到 BUNDLE_CACHE_PATH
中,而不是本地系统范围内的、通常为只读的目录中。“宝石”和“捆绑”的关系还不清楚。清楚的是:
普通的包管理器(如 Java 中的 mvn 或 Node.js 中的 npm)是使用 Ruby 中的 3 个工具完成的:
Gem 和 Bundle 之间的功能冲突显然是整个 Ruby 世界的一个缺点,这些都应该是相同的(或者它们应该有非常明确的区分和记录良好的职责)。