【问题标题】:cannot load such file -- 'nokogiri\nokogiri' ruby 2.7无法加载此类文件 - 'nokogiri\nokogiri' ruby​​ 2.7
【发布时间】:2020-12-07 14:19:04
【问题描述】:

我在本地运行 AWS Lambda。

当我运行 lambda 函数时,这是我得到的错误:

 {
  "errorMessage": "cannot load such file -- nokogiri/nokogiri",
  "errorType": "Init<LoadError>",
  "stackTrace": [
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/task/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri.rb:15:in `rescue in <top (required)>'",
    "/var/task/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri.rb:11:in `<top (required)>'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/task/vendor/ruby/2.7.0/gems/google_drive-3.0.5/lib/google_drive/session.rb:8:in `<top (required)>'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/task/vendor/ruby/2.7.0/gems/google_drive-3.0.5/lib/google_drive.rb:7:in `<top (required)>'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/task/main.rb:7:in `<top (required)>'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'",
    "/var/lang/lib/ruby/site_ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'"
  ]
}

我查看了/var/task/vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri.rb:15,这是导致一切崩溃的代码:`require 'nokogiri/nokogiri'

这些是 `./vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib' 中的文件:

nokogiri
nokogiri.rb
xsd

这些是./vendor/ruby/2.7.0/gems/nokogiri-1.11.0.rc2/lib/nokogiri/中的文件:

css
decorators
html.rb
nokogiri.bundle
version.rb
xml.rb
xslt.rb
css.rb
html
jruby
syntax_error.rb
xml
xslt

没有文件nokogiri/nokogiri,因此我认为是错误。我试图将nokogiri.rb 复制到目录nokogiri 螺母弹出其他错误。

我该如何前进?

谢谢!

【问题讨论】:

  • 嗨,你解决过这个问题吗?
  • 有什么解决办法吗?
  • 你是怎么解决这个问题的?
  • 对不起,自从我转移到另一个项目后,这个问题一直没有解决。希望有人遇到同样的问题并发布解决方案。对不起,大家。

标签: ruby nokogiri


【解决方案1】:

在阅读这篇文章 https://www.stevenringo.com/ruby-in-aws-lambda-with-postgresql-nokogiri/ 之前,我一直面临着同样的问题。

总而言之,问题在于使用 AWS Lambda 时,无法在环境/Lambda 上执行命令。因此,虽然您可以在本地使用 bundle install,但您不能在 Lambda 上使用它。话虽如此,正如文章提到的那样, we need to find a way to package and compile dependencies ahead of time in an environment that is compatible with the Lambda environment.

这导致我们从 docker 容器编译依赖项以匹配 lambda 环境的替代解决方案。为了解决问题,您需要执行以下操作:

  1. 在本地机器上安装 docker

  2. 在您的 ruby​​ 项目中创建一个Dockerfile,使用以下行:

    FROM lambci/lambda:build-ruby2.7
    
    CMD "/bin/bash"
    
  3. 使用以下命令构建您的 docker 映像:docker build -t lambda-ruby2.7 .(不要忘记末尾的句点!)

  4. 使用以下命令进入容器内的外壳: docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.7

  5. 从外壳/容器中,运行bundle install --path vendor/bundle --clean

  6. 退出shell

  7. 在项目中,压缩它:zip -q -r deploy.zip .

这个解决方案对我有用。希望它可以成为一种替代方案,直到有人弄清楚如何在不使用 Docker 的情况下做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2015-05-15
    • 1970-01-01
    • 2015-05-14
    • 2016-05-29
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多