如何使用excludeDevDependencies?

时间:2018-10-19 10:44:35

标签: serverless-framework

阅读文档后:https://serverless.com/framework/docs/providers/google/guide/packaging#development-dependencies

我制作了一个示例来测试此配置。

这是我的serverless.yml

service: exclude-development-dependencies

provider:
  name: google
  runtime: nodejs
  project: just-aloe-212502
  credentials: /Users/ldu020/workspace/nodejs-serverless-framework/.gcp/nodejs-starter-7e52b0f6fe39.json

plugins:
  - serverless-google-cloudfunctions

package:
  exclude:
    # - node_modules/**
    - .gitignore
    - .git/**
  excludeDevDependencies: true

functions:
  excludeDevDependencies:
    handler: excludeDevDependencies
    events:
      - http: path

问题是excludeDevDependencies仅在我评论exclude - node_modules/**时才能正常工作。

它将生成.serverless目录,并且exclude-development-dependencies.zip包含dependency节点模块。

但是对于GCP,您不需要上传node_modules。您只需要将package.jsonpackage-lock.json文件上传到GCPGCP将基于node_modules安装package-lock.json

那么,我什么时候应该使用excludeDevDependencies

3 个答案:

答案 0 :(得分:1)

excludeDevDependencies 设置是您可以在 serverless.yml 文件中的 package 配置中提供的一个选项。

默认情况下,它已经定义为 true,因此将其明确设置为 true 不会有任何影响,除了明确指出此类配置存在。只有将其设置为 false 才会有影响。

使用此功能时,例如运行 serverless packageserverless deploy 时,CLI 将遵循以下步骤:

  1. 阅读在您的根 package.json 文件中列出的所有依赖项/devDependencies
  2. 遍历由那些派生的依赖树,并找到 /node_modules 文件夹中的所有模块/子模块位置
  3. 如果定义了 include / exclude 路径,则分别标记为包含/排除。
  4. 去掉由 devDependencies 派生树派生的路径,但保留 dependencies 树所需的路径
  5. 返回路径的结果列表,这些路径将是唯一包含在最终上传到您的无服务器提供商的包中的路径。

例如,这对于无服务器 AWS Lambda 环境很有意义,您必须将所需的确切源作为一个整体上传。

现在,既然你说在 GCP 的情况下,包是由提供者处理/安装的,那么你不需要上传任何 node_modules 路径,所以你应该通过将整个文件夹设置为安全使用 serverless.yml 设置排除 exclude

额外说明: 过去,此 excludeDevDependencies 功能存在一些错误,导致其在某些情况下无法正常工作,但其中许多(如果不是全部)已在最新的 2.x 版本中得到解决。

您可以在他们的 changelog 中找到那些,寻找“包装”功能。

如果您遇到这种情况,请考虑升级到最新版本,即今天的 2.25.0。

答案 1 :(得分:0)

这是预期的行为,不是吗?

请勿将node_modules排除在外。您在package.json中拥有的所有依赖项都应加载到无服务器包中。如果您拥有package.json,则excludeDevDependencies: true中的任何开发依赖项都将被排除。

  

GCP将基于package-lock.json安装node_modules。

我不知道什么是GCP,但是当没有本地文件存储时,您如何期望它将在lmabda上安装package.json?

无服务器包中必须包含运行lambda所需的任何node_modules。

答案 2 :(得分:0)

我遇到了同样的问题,如果我使用了include中的node_modules,那么还将包括dev依赖项。一段时间后,我发现您只需使用以下方法添加node_modules和您感兴趣的任何文件夹不排除它们

  exclude:
    - '!folderyouwanttoadd/**'
    - '!fileyouwanttoadd'
    - '!node_modules/**'

要包含为excludeDevDependencies: true是可选的,因为它是默认设置。我认为这是Serverless的错误,应该直接运行。