如何在基于arm 64-达尔文的Mac上安装基于arm 64-Linux的ruby gems?

of1yzvn4  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(185)

我在将一个项目部署到AWS lambda时遇到了麻烦,代码在我的笔记本电脑上运行得很好,但是在Lambda上部署会产生与google-protobuf gem相关的问题。它是我包中唯一一个针对不同架构有多个版本的gem,所以我相信它与此有关。
我试着直接安装这个gem,即没有安装插件,但我得到了一个错误,rake失败,引用它找不到目录:/Users/myUser/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rake-13.1.0-arm64-linux/exe/rake (LoadError)
这让我相信它是无法安装的,因为rbenv只有arm 64-达尔文目录。我如何安装基于arm 64-Linux架构的rbenv?或者任何其他解决方案将不胜感激。

7kqas0il

7kqas0il1#

前言

您没有提供Gemfile或Gemfile.lock的副本,也没有附加任何有意义的日志。因此,我们只能猜测实际的构建或运行时是什么。这个答案不会不断更新以匹配不完整和不可重现的问题。但是,可以进行一些有根据的猜测,我在下面为您提供了一些可操作的依赖于平台的gem管理步骤。

Bundler支持平台专用Gem

你说你正在做一些相当手动的事情,而不是使用Bundler。不清楚你为什么要这样做,因为你应该动态地使用Bundler,或者提前为目标平台升级你的gems。
Gems,特别是那些使用原生扩展的Gems,需要特定于平台的构建和(很可能)动态库,这些库在目标主机上不可用。您应该使用bundle-lock将所有目标平台添加到Gemfile.lock中,以便bundle install在目标主机上运行时能够正确解析gems。您可以使用以下命令来执行此操作:

bundle lock --add-platform arm64-linux

字符串
这将确保arm64-linux被添加到Gemfile.lock将正确管理的平台列表中。然后在Gemfile.lock所在的目录中运行bundle platform将为您提供类似于以下内容的内容:

Your platform is: arm64-darwin-23

Your app has gems that work on these platforms:
* arm64-darwin-23
* arm64-linux
* ruby


如果您需要一个更具体的平台,您可能需要在远程主机上运行gem environment platform,以查看它认为特定的平台是什么,然后添加该平台。

副本和本地镜像测试

如果缺少依赖项,则可能需要仔细查看远程容器。例如,它可能基于musl libc而不是glibc,或者可能缺少特定的构建依赖项。如果是这样,则需要调试构建过程或查看文档,以确定目标平台上可能缺少哪些构建依赖项。
您还可以考虑按照文档中相应部分的说明在本地测试用于Lambda容器的特定AWS映像,或者按照其他更适合您使用的映像的说明进行测试。无论如何,本地测试将保存大量时间和往返麻烦,因此您可以更快地隔离问题。
也许你还可以做其他的事情,但这是一个正确的起点,至少能让你朝着正确的方向前进。

相关问题