Развертывание функции ReasonML в облачных функциях Google - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь написать процесс развертывания для получения вывода 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. Я пытался использовать веб-пакет для упаковки всего необходимого в файл index.js, который я могу запустить как облачную функцию Google, но я не знаю, как предоставить имя моей функции для использования GCP.

Я использую Node.js 8 (бета).

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Спасибо за информацию. Мой код опирался на bs-express, который на самом деле является слоем ReasonML над ExpressJS. Это было похоронено в моей папке node_modules, которая вызывала сбой оператора require в сгенерированном файле .bs.js. Однако я скопировал эту зависимость в мой каталог src и отредактировал файл helloworld2.bs.js, чтобы указать на него, это сработало.

0 голосов
/ 28 августа 2018

Развертывание скомпилированного ReasonML модуля JavaScript в Google Cloud Functions во многом аналогично развертыванию модуля EcmaScript, поэтому хорошим руководством для понимания основ является https://cloud.google.com/functions/docs/tutorials/http#functions-update-install-gcloud-node8

Главное, что вам нужно убедиться, это то, что Reason выводит переносимый модуль JavaScript, который выглядит так, как ожидает GCF. Однако я предвижу проблему с использованием Webpack, потому что он захочет упаковать вашу локальную версию Express в выходной JS, а мы этого не хотим - мы хотим использовать Express, предоставленный GCF.

Чтобы обойти эту проблему, я бы, вероятно, не использовал пакет JavaScript, а вместо этого перечислял бы bs-platform в разделе package.json dependencies, чтобы он устанавливался во время развертывания функции, и express в peerDependencies раздел, так что при развертывании используется предоставленная версия Express.

В соответствии с ссылкой , вы можете назвать файл модуля так, как вам нравится, если вы перечислите имя в package.json со строкой "main": "src/App.bs.js". В этом примере вы можете назвать исходный файл Reason src/App.re.

Следующий шаг - убедиться, что ваша функция соответствует тому, как должен выглядеть обработчик экспресс-маршрутизации. Если вы заметите, учебник, на который я ссылался, показывает эту форму функции в JavaScript: exports.foo = (req, res) => ...;. Чтобы скомпилировать функцию Reason для этой формы, нам нужна uncurried Функция 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 сообщает команде deploy, какую функцию запустить в развернутом модуле.

...