Как упаковать для лямбда / облачных функций 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.