阅读文档后: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.json
和package-lock.json
文件上传到GCP
。 GCP
将基于node_modules
安装package-lock.json
。
那么,我什么时候应该使用excludeDevDependencies
?
答案 0 :(得分:1)
excludeDevDependencies
设置是您可以在 serverless.yml
文件中的 package 配置中提供的一个选项。
默认情况下,它已经定义为 true,因此将其明确设置为 true 不会有任何影响,除了明确指出此类配置存在。只有将其设置为 false 才会有影响。
使用此功能时,例如运行 serverless package
或 serverless deploy
时,CLI 将遵循以下步骤:
package.json
文件中列出的所有依赖项/devDependencies/node_modules
文件夹中的所有模块/子模块位置include
/ exclude
路径,则分别标记为包含/排除。例如,这对于无服务器 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的错误,应该直接运行。