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

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

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

Я хочу создать пакет для развертывания в Google Cloud Functions (и аналогичных приложениях на 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 эквивалент для фильтрации пакетов?

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам