Я использую AWS Cloud Formation для своей серверной части со следующей структурой файлов проекта:
| template.yaml
| lambda-functions
| ---- function-1
|----function.js
|----package.json
| ---- function-2
|----function.js
|----package.json
В спецификации сборки AWS я использую aws cloudformation package, а затем aws cloudformation deploy.
Если я хочу, чтобы он работал, мне нужно сделать npm install для вложенных папок function-1 и function-2 и зафиксировать вложенные папки node_modules в репозиторий git.
Как я могу запустить npm install во всех моих подпапках прямо из buildspec, чтобы мне не приходилось фиксировать подпапки node_modules?





Вы можете использовать Лерна.
Lerna также поможет вам, если у вас есть зависимости между вашими пакетами.
По сути, вам просто нужно добавить lerna.json в корневой каталог и установить свои зависимости с помощью lerna.
lerna.json:
{
"lerna": "2.11.0",
"packages": [
"lambda-functions/*"
],
"version": "0.0.0"
}
Я предполагаю, что вы используете AWS CodeBuild, поэтому вот несколько примеров того, как вы можете настроить этап установки:
buildspec.yml с lerna:
version: 0.2
phases:
install:
commands:
- echo Entered the install phase...
- npm install --global lerna
- lerna bootstrap --concurrency=1 -- --production
...
lerna bootstrap создаст node_modules для каждого отдельного пакета.
Если вы не хотите использовать lerna, вы можете добавить по одной команде для каждого пакета. Что-то вроде:
buildspec.yml с пряжей:
version: 0.2
phases:
install:
commands:
- echo Entered the install phase...
- npm install --global yarn
- yarn --cwd lambda-functions/function-1 --production install
- yarn --cwd lambda-functions/function-2 --production install
- yarn --cwd lambda-functions/function-3 --production install
...
или:
buildspec.yml с npm:
version: 0.2
phases:
install:
commands:
- echo Entered the install phase...
- cd lambda-functions/function-1 && npm install --production
- cd lambda-functions/function-2 && npm install --production
- cd lambda-functions/function-3 && npm install --production
...
Спасибо за информацию, из того, что я собрал, lerna использует символические ссылки (не переустанавливая пакет), если он сталкивается с общим пакетом, это правильно? Если да, то эти лямбда-функции упаковываются и развертываются независимо, как это будет работать? Пакет с символической ссылкой не существует.
Потрясающе, я не знал о lerna, я посмотрю на нее.