如何让 AWS lambda 在我的函数中找到 grpc 依赖项?

How can I make AWS lambda find the grpc dependency in my function?

GRPC 在这里让我很满意:

{
  "errorMessage": "Could not find 'grpc' (~> 1.24) among 281 total gem(s)\nChecked in 'GEM_PATH=/var/task/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0:/var/runtime', execute `gem env` for more information",
  "errorType": "Init<Gem::MissingSpecError>",
  "stackTrace": [
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/dependency.rb:311:in `to_specs'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/specification.rb:1402:in `block in activate_dependencies'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/specification.rb:1391:in `each'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/specification.rb:1391:in `activate_dependencies'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/specification.rb:1373:in `activate'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems.rb:215:in `rescue in try_activate'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems.rb:208:in `try_activate'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:161:in `rescue in require'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:35:in `require'",
    "/var/task/vendor/bundle/ruby/2.5.0/gems/google-cloud-dialogflow-0.14.0/lib/google/cloud/dialogflow.rb:16:in `<top (required)>'",
    "/var/task/google_dialog.rb:3:in `require_relative'",
    "/var/task/google_dialog.rb:3:in `<top (required)>'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:168:in `require'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:168:in `rescue in require'",
    "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:35:in `require'"
  ]
}

我在 vendor/bundle/ruby/2.5.0/gems/grpc-1.27.0-universal-darwin/src/ruby/lib/grpc.rb

看到了

我正在编写一个简单的 Ruby class 来连接到 Dialogflow,google gem 相当繁重,有很多依赖项。我已经编写了一些测试,这些测试都在本地以及在我提取这段代码的 Rails 应用程序的上下文中通过。我需要 Nokogiri,但 Google 似乎是 GRPC 东西的大用户。当我手动指定时,它不会找到该文件。非常感谢任何帮助。

在上述问题的情况下 - 操作顺序是我学到的一切。 Ruby 正在自上而下解析而不是加载所有内容然后再解析,我想我应该知道这一点,但是 Rails 为您做了很多神奇的事情。

所以当我看到上面的问题时,我的文件顶部有以下要求语句:

require_relative 'vendor/bundle/ruby/2.5.0/gems/nokogiri-1.10.9/lib/nokogiri.rb'
require_relative 'vendor/bundle/ruby/2.5.0/gems/google-cloud-dialogflow-0.14.0/lib/google/cloud/dialogflow.rb'
require_relative 'vendor/bundle/ruby/2.5.0/gems/google-cloud-dialogflow-0.14.0/lib/google/cloud/dialogflow/v2.rb'
require_relative 'vendor/bundle/ruby/2.5.0/gems/grpc-1.24.0-universal-darwin/src/ruby/lib/grpc.rb'

并且由于在 google 云之后需要 grpc ruby

require_relative 'vendor/bundle/ruby/2.5.0/gems/grpc-1.24.0-universal-darwin/src/ruby/lib/grpc.rb'
require_relative 'vendor/bundle/ruby/2.5.0/gems/nokogiri-1.10.9/lib/nokogiri.rb'
require_relative 'vendor/bundle/ruby/2.5.0/gems/google-cloud-dialogflow-0.14.0/lib/google/cloud/dialogflow.rb'
require_relative 'vendor/bundle/ruby/2.5.0/gems/google-cloud-dialogflow-0.14.0/lib/google/cloud/dialogflow/v2.rb'

只需将 grpc 放在 dialogflow 之前即可解决该问题。

教训 - 总是回到基础。