如何在无服务器框架中包含静态文件?
Posted
技术标签:
【中文标题】如何在无服务器框架中包含静态文件?【英文标题】:How to include static files on Serverless Framework? 【发布时间】:2018-07-11 18:56:27 【问题描述】:我正在使用无服务器框架创建一个 NodeJS 服务来验证提要,因此我向该服务添加了一个模式文件 (.json),但我无法使其工作。 它似乎不包含在包装中。 Lambda 没有找到该文件。
首先我只是运行 sls 包并检查 zip 内容,但该文件不存在。 我还尝试将文件包含在:
package:
include:
- libs/schemas/schema.json
但还是不行。
如何确保静态文件包含在包中并且可以在 lambda 函数中读取?
【问题讨论】:
看来你有correct syntax。您是否仔细检查过您的路径 (libs/schemas/schema.json
) 是否正确拼写?你不是在配置文件中声明另一个include
选项吗?
ok,找到问题了,和webpack有关。我使用的是无服务器 webpack 插件,并且不包括文件。我更改了插件,现在它尊重我的配置。感谢您的提示。
@yabune 你能告诉我你改成哪个插件吗?
@yabune 我也有同样的问题。你做了什么改变?
【参考方案1】:
这取决于您实际尝试加载文件的方式。
您是用fs.readFile
还是fs.readFileSync
加载它?
在这种情况下,Serverless 不知道您将需要它。如果您为无服务器添加提示以将该文件包含在捆绑包中,请确保您知道它相对于当前工作目录或 __dirname
的位置。
您是否使用require()
加载它? (你知道你可以使用require()
来加载 JSON 文件吗?)在这种情况下,Serverless 应该知道你需要它,但你仍然需要确保路径正确。
如果所有其他方法都失败了,那么您总是可以使用肮脏的 hack。 例如,如果您有一个包含以下内容的文件“x.json”:
"a": 1,
"b": 2
然后您可以将其更改为包含以下内容的x.js
文件:
module.exports =
"a": 1,
"b": 2
;
您可以像加载任何其他 .js 文件一样加载,但这是一个 hack。
【讨论】:
谢谢,我发现它与 webpack 配置有关,不尊重我的无服务器配置,但你的建议很好,它也可以解决问题。 @rsp 请详细说明如何编写该“提示” @Jeremy @rsp 建议的“提示”是按照docs 在serverless.yml
文件中配置serverless-bundle
。基本上,你需要在custom
下添加一个属性bundle
并进行相应的配置。【参考方案2】:
根据我的发现,您可以通过多种方式做到这一点:
正如另一个答案所述:if you are using webpack you need to use a webpack plugin to include files in the lambda zip file
如果你不使用 webpack,可以使用serverless package commnad (include/exclude)。
您可以create a layer and reference it from the lambda(文件将位于/opt/<layer_name>
。考虑到今天(11 月 20 日)I haven't found a way of doing this if you are using serverless.ts
无需先发布图层(lambda 的 layer 属性是 ARN 字符串,需要图层版本)。
如果您担心安全性you can use AWS Secrets as it is stated in this answer。
您可以按照@rsp 所说的去做并将其包含在您的代码中。
【讨论】:
以上是关于如何在无服务器框架中包含静态文件?的主要内容,如果未能解决你的问题,请参考以下文章