如何在无服务器框架中包含静态文件?

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 所说的去做并将其包含在您的代码中。

【讨论】:

以上是关于如何在无服务器框架中包含静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

在动态框架中包含静态库的公共头文件

如何打开框架中包含的视图控制器作为 iOS 的静态库?

在 iOS 的动态框架中包含静态库

在 Xcode 静态库中包含框架?

是否可以在无跟踪器的种子文件中包含对等点?

如何在 Jinja2 模板中包含 HTML 文件?