4

我正在尝试编写一个部署过程来获取 ReasonML.bs.js输出并将其部署为 Google Cloud 功能。

这是 ReasonML 代码:

/*!
 * My first ReasonML Google cloud function.
 * Hadil G. Sabbagh
 */
open Express;

let helloworld2 = (req: Request.t) => (res: Response.t) => {
        Response.status(Response.StatusCode.Ok, res) |> 
Response.sendString("Hello world!");
};

我已经成功构建了一个helloworld2.bs.js文件。我一直在尝试使用 webpack 将所需的所有内容打包到一个index.js可以作为 Google Cloud Function 运行的文件中,但我不知道如何公开我的函数名称以供 GCP 使用。

我正在使用 Node.js 8(测试版)。

4

2 回答 2

1

谢谢提供信息。我的代码依赖bs-express,这实际上是一个 ReasonML 层之上ExpressJS。这被埋在我的node_modules文件夹中,导致require生成文件中的语句.bs.js失败。但是,我将依赖项复制到我的src目录中并编辑helloworld2.bs.js文件以指向它,它起作用了。

于 2018-08-29T22:42:38.290 回答
0

将 ReasonML 编译的 JavaScript 模块部署到 Google Cloud Functions 与部署 EcmaScript 模块大致相同,因此了解基础知识的好教程是https://cloud.google.com/functions/docs/tutorials/http#functions-更新-安装-gcloud-node8

你需要确保的主要事情是 Reason 输出一个看起来像 GCF 期望的转译的 JavaScript 模块。但是,我确实预见到使用 Webpack 会出现问题,因为它希望将本地版本的 Express 打包到输出 JS 中,而我们不希望这样——我们希望使用 GCF 提供的 Express。

为了解决这个问题,我可能不会使用 JavaScript 捆绑器,而是bs-platformpackage.json dependencies部分中列出,以便在函数部署期间安装它,并expresspeerDependencies部分中列出,以便部署使用提供的 Express 版本。

根据参考资料,您可以随意命名模块文件,只要您package.json在行中列出名称即可"main": "src/App.bs.js"。在本例中,您可以命名您的 Reason 源文件src/App.re

下一步是确保您的函数符合 Express 路由处理程序的外观。如果您注意到,我链接到的教程在 JavaScript 中显示了这个函数形状:exports.foo = (req, res) => ...;. 要将一个 Reason 函数编译成这个形状,我们需要一个非柯里化的Reason 函数:

let helloworld2 = (. _req, res) => {
  open Express;

  res
  |> Response.status(Response.StatusCode.Ok)
  |> Response.sendString("Hello world!")
};

(函数参数左括号后面的点表示它是一个非柯里化函数。顺便说一句,我还将该函数重新排列为更惯用的 Reason 样式。)

最后,您部署:

gcloud beta functions deploy helloworld2 --runtime nodejs8 --trigger-http

helloworld2告诉部署命令在部署的模块中运行哪个函数。

于 2018-08-28T00:17:59.707 回答