Как упаковать для лямбда / облачных функций Google без включения всех ненужных зависимостей - PullRequest
0 голосов
/ 05 июля 2018

Что мне не нравится в Node, так это то, что как только вы добавляете одну require("whatever"), вы получаете 1000 транзитивных зависимостей, которые вызывают require при вероятности того, что код может понадобиться.

var whatever = require('whatever');
if (probablyFalse) {
   whatever.theOnlyFunctionThatIUse(); 
   // ...but `whatever` et al require other libraries which I won't actually use
}

Я хочу создать пакет для развертывания в облачных функциях Google (и аналогичных приложениях в Lambda). Мой код импортирует @ google-cloud / datastore, который имеет много транзитивных зависимостей, некоторые из которых имеют двоичные файлы, вычисляемый импорт и т. Д. Я не хочу сталкиваться с ограничениями размера пакета или увеличивать время, необходимое Node для анализа кода , Я хочу использовать упаковочный инструмент, который выполняет встряхивание дерева и компилирует (большую часть) мой код и зависимости в один файл. Я хочу иметь возможность указать, какие библиотеки исключить из index.js и предоставить только необходимые файлы в node_modules.

Поскольку я компилирую Typescript и использую другие библиотеки в своем процессе сборки / тестирования / упаковки / развертывания, node_modules содержит от 100 до 1000 библиотек, большинство из которых не нужны в работе.

В идеале, я бы хотел создать что-то похожее на:

  • package.json - {"main": "index.js", зависимости: {"@ google-cloud / datastore": "1.4.1"}}
  • index.js - скомпилирован из нескольких файлов TypeScript в моем проекте и большей части кода, который я импортирую из библиотек и транзитивных зависимостей
  • node_modules - все, но только код, который не включен в index.js, но необходим для запуска приложения.

Я создал простое демонстрационное приложение, чтобы показать, что я пытаюсь сделать (в настоящее время я использую FuseBox ):

https://github.com/nalbion/packaged-google-function/blob/master/lib/demo.js

Чтобы исключить @ google-cloud / datastore и его транзитивные зависимости из моего скомпилированного demo.js, я добавил filterFile:

filterFile: file => {
    return !['@google-cloud/datastore'].includes(file.collection.name);
},

Меня смущают строки в выводе:

FuseBox.pkg("@google-cloud/datastore", {}, function(___scope___){
    return ___scope___.entry = "src/index.js";
});

Облачные функции Google также сбиты с толку:

TypeError: Cannot read property 'default' of null
    at helloWorld (/user_code/demo.js:10:42)

Для справки, демо работало, пока я не попытался добавить код хранилища данных:

https://github.com/nalbion/packaged-google-function/blob/no-dependencies/lib/demo.js

Я подозреваю, что filterFile не предназначен для этой цели, или, возможно, я неправильно его использую.

Есть ли в FuseBox эквивалент для фильтрации пакетов?

Есть ли лучший способ сделать это?

(Edit) Существует известная проблема с частными репозиториями git:

https://github.com/GoogleCloudPlatform/nodejs-docs-samples/issues/300

Автоматическое развертывание облачных функций Google из Google Cloud Source Control

1 Ответ

0 голосов
/ 05 июля 2018

Вы собираетесь делать слишком много работы без необходимости.

Google Cloud Functions автоматически обрабатывает зависимости для вас, устанавливая их на сервере с помощью npm после развертывания (при условии, что зависимости перечислены в вашем package.json). Он не загружает содержимое node_modules. Не пытайтесь создать материализованную версию ваших зависимостей, если только вы действительно не хотите, чтобы GCF автоматически устанавливал их из npm.

...