我在将项目部署到 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 只有 arm64-darwin 目录。如何在arm64-linux架构中安装基于rbenv?或者任何其他解决方案将不胜感激。
您没有提供 Gemfile 或 Gemfile.lock 的副本,也没有附加任何有意义的日志。因此,我们只能猜测实际的构建或运行时是什么。该答案不会持续更新以匹配不完整且不可重现的问题。但是,可以做出一些有根据的猜测,我在下面为您提供了一些可行的依赖于平台的 gem 管理步骤。
您说您正在做一些相当手动的事情,而不是使用 Bundler。目前尚不清楚为什么你要这样做,因为你应该动态使用 Bundler 或提前为目标平台供应 gem。
Gems,尤其是那些使用本机扩展的 Gems,需要特定于平台的构建和(很可能)目标主机上不可用的动态库。您应该使用 bundle-lock 将所有目标平台添加到 Gemfile.lock 中,以便
bundle install
在目标上运行时能够正确解析 gem。你可以用类似的东西来做到这一点:
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 映像。无论如何,本地测试将为您节省大量时间和往返麻烦,以便您可以更快地隔离问题。 您可能还可以做其他事情,但这通常是正确的起点。它至少应该让你指明正确的方向。