无法加载此类文件 -- 'nokogirinokogiri' Ruby 2.7



我正在本地运行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中,但出现了其他错误。

我该如何前进?

谢谢!

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

总之,问题是在使用AWS Lambda时,无法在environment/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. 使用以下命令在容器中输入shell:docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.7

  5. 从shell/容器运行bundle install --path vendor/bundle --clean

  6. 退出外壳

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

这个解决方案对我很有效。希望它能成为一个替代方案,直到有人想出如何在不使用Docker的情况下做到这一点。

相关内容

  • 没有找到相关文章

最新更新