gpt4 book ai didi

webpack - 无服务器框架功能的 AWS Lambda 文件系统路径?

转载 作者:行者123 更新时间:2023-12-04 21:03:55 25 4
gpt4 key购买 nike

所以这看起来很容易,但一直很棘手。显然,Serverless 与 webpack 捆绑在一起,然后在使用 Cloud Formation 部署之前上传到 S3。

这里的问题是 webpack 节点 __dirname 有一些问题,你可以在这里阅读:
https://github.com/webpack/webpack/issues/1599

基本上这意味着在考虑使用 __dirname 获取绝对路径之前,您需要将以下内容添加到您的 webpack 配置中(就在 target: node, 之后):

  // assume target: 'node', is here

node: {
__dirname: false,
},:

所以。伟大的。我的问题是:

For a Serverless project — which has multiple functions — based on the standard starter kit, what is the root directory of a given function within the base repo?



我将上面的代码添加到我的 webpack 配置中,并且 __dirname 现在再次工作,但是我仍然无法找到打包在 repo 中的文件。

repo 看起来像这样:
repo-root
——— src
——— ——— someFunction
——— ——— ——— some-sub-directory
——— ——— ——— ——— targetfile.json

What do I append to '__dirname' in order to hit targetfile.json?

最佳答案

简短的回答:

AWS Lambda functions handler.js build / spawned by a Serverless Framework will be placed at the path: /var/task/src/hander.js



Lambda(至少是 Node8.10)的默认运行时目录是:
/var/task

长答案:这是关于包含 JSON 文件的 webpack。
我真的问错了问题来达到我想要的结果。我真正想知道的是:

我如何告诉 webpack 在我的无服务器框架 Lambda 函数中包含一个 json 文件——以便 lambda 可以在运行时访问该 json 文件?

在你的 repo 中,/src 目录(可能——如果你使用默认的无服务器项目结构)包含你的 handler.js 文件并且是你的 Repo 的引用点(从你的无服务器项目复制的第一个目录)——没有超过src 目录被复制进去。

也就是说,尝试假设您的本地文件/文件夹结构如下所示:
repo-root
——— src
——— ——— someFunction
——— ——— ——— some-sub-directory

请务必记住,无服务器 AWS Lambda 文件结构如下所示(默认情况下):
——— src
——— ——— handler.js
——— node_modules

请注意,除了 handler.js 文件之外,没有其他任何东西(默认情况下)。

没有子目录没有什么。这是因为 webpack 没有被告知包含 JSON 文件(这需要一些工作)。

通过“__dirname”更正无服务器 Lambda 绝对路径

需要做的第一件事是在您的代码库中包含/要求/引用您的 json 文件。这让 webpack 知道你以后会需要它:
let file = require('./some-sub-directory/targetfile.json');

如果您没有正确地需要 JSON 文件,那么您指向它的位置不会有任何区别。另一个更“hacky”的选项是将您的 JSON 文件重命名为 .js,然后通过相同的过程包含。

Webpack 文件加载器配置

仅包含 JSON 文件(在我的情况下)并不会触发 webpack 将文件实际包含在捆绑器中。我还需要添加 webpack 文件加载器: https://www.npmjs.com/package/file-loader

然后将以下内容添加到我的 webpack 配置中——根据规则(webpack 4 会略有不同):
{
// type: 'javascript/auto', // this would be for webpack 4
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name: "./src/mypackedfiles/[name].[ext]"
}
}
]
}

可以在此处找到更多详细信息:
https://github.com/webpack/webpack/issues/6586#issuecomment-379448638

请记住,仅包含文件不会解析包含在该文件中的值——它只会告诉 webpack 包含它,以便您可以使用 fs 从 Lambda 本地读取它。或其他一些方法。

故障排除(定位文件)

这里的关键(如果您像我一样试图让无服务器 AWS Lambda 函数包含/访问一个 json 文件)是要意识到这实际上更多是 webpack 的问题,而不是 Lambda 路径的问题。

出于这个原因,解决/查找文件的最佳方法就是构建您的函数,然后解压缩它创建的文件以查看您的 json 是否已正确包含。

一旦它被包含 - 那么你可以使用上面提到的 __dirname 设置来跟踪并实际使用该文件。

无服务器 Lambda 中的最终 JSON 文件位置

基于上述 webpack 配置,您的目录结构(在您的 zip 中)将如下所示:
——— src
——— ——— mypackedfiles
——— ——— ——— targetfile.json
——— ——— someFunction
——— ——— ——— some-sub-directory
——— node_modules

所以考虑到这一点,你对 webpack 添加的 json 文件的引用现在看起来像这样:
let filelocation = __dirname + '/mypackedfiles/targetfile.json'

您现在可以从 fs 访问文件位置或任何您想要的解析器,因为它已正确包含在您的无服务器 lambda 中。

Note for Multiple Functions within one Repo: With this method the json file will be copied into EVERY function that is spawned by your repo. This may or may not be a good thing for you but it works fine for me since my JSON files are not overly huge.

关于webpack - 无服务器框架功能的 AWS Lambda 文件系统路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51549209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com