【问题标题】:AWS SAM: Could not install from function as it does not contain a package.json fileAWS SAM:无法从函数安装,因为它不包含 package.json 文件
【发布时间】:2020-06-25 13:50:10
【问题描述】:

我在 Visual Studio Code 中使用 AWS SAM 来设置许多 Node.js lambda 函数。我正在使用 Windows 10。我只是从 AWS SAM 开始,我已经使用命令面板生成了示例 Hello World 应用程序,它可以工作。我开始通过添加第二个功能来扩展应用程序,并重新构建目录结构以开始添加更多功能。我的目录结构现在如下所示:

|--my-app
|  |--event-handlers
|  |  |--hello-world
|  |  |  |--app.js
|  |  |--hello-world-2
|  |  |  |--app.js
|  |--package.json
|  |--template.yml

当我运行sam build 时,我收到错误无法从 ..\my-app\event-handlers\hello-world 安装,因为它不包含 package.json 文件。如果我将 package.json 文件复制到每个子目录 hello-worldhello-world-2 中,那么 sam build 可以正常工作。但是我需要为每个函数指定一个单独的 package.json 文件似乎不正确,因为它违反了 DRY 原则。如果我像这样构造它,我期待它应该使用根目录中的 package.json 来处理我的所有 lambda 函数。

我真的需要为每个 lambda 函数复制 package.json 文件吗?就定义多个 lambda 函数的 SAM 应用程序的目录结构而言,最佳实践是什么?为什么它没有从我的根目录中提取我的 package.json 文件?

作为参考,我也包含了我的 template.yaml 文件的一部分

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: event-handlers/hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Events:
        HelloWorld:
          Type: Api 
          Properties:
            Path: /hello
            Method: get

  HelloWorldFunction2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: event-handlers/hello-world-2/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Events:
        MyScheduledEvent:
          Type: Schedule
          Properties:
            Schedule: rate(2 minutes)
            Name: app.lambdaHandler
            Description: Interval at which node function should be called
            Enabled: True

【问题讨论】:

  • 这似乎是sam build 的一部分。它可以是一个空文件。或者如果你不需要它就避免使用sam build
  • 我尝试使用空文件,但它需要文件中的 json 格式。所以然后我将它设为空 {} 但随后它开始进行验证并给出错误“NPM 失败:npm ERR!package.json 需要一个“名称”字段”等。这意味着我必须从主要复制“必需”字段将根目录中的 json 文件添加到所有子功能......这让我回到了我原来的问题。复制文件感觉不是正确的方法,而是某种错误配置,即没有为所有子功能选择更高级别的文件。

标签: node.js aws-lambda aws-sam


【解决方案1】:

每个 lambda 都使用自己的依赖堆栈进行部署。在我遇到的大多数情况下,这是一件好事。具有完全相同依赖关系的两个 lambda 表示其中一个函数中存在重复的功能或未使用的依赖关系。

我遇到了和你一样的错误,但是因为我没有在根文件夹中有package.json。使用sam init 生成的hello-world 示例项目在根文件夹中也没有,但不知何故sam build 构建它没有问题。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。

    解决方法是将 package.json 向下移动一级,即

    简而言之,您应该始终按照下图正确构建您的 SAM 项目

    【讨论】:

      【解决方案3】:

      就我而言,我只需要从无服务器函数中删除 CodeUri 属性。即使路径看起来正确,sam build 命令还是失败并显示上述消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多