Npm/yarn install separate package.json

Хаю-хай

Хочу командами типа yarn/npm install устанавливать отдельные пачки пакетов
типа:

dev - только пакеты для разработки
test - только пакеты для тестов (karma и все сопуствующие пакеты)
prod - все пакеты

Кто-то чем-то подобным занимался?

Подобная механика уже встроена в то как описываются зависимости.

npm install --production установит только зависимости из секции "dependencies" package.json.

npm install установит завсимости и из "dependencies" и из devDependencies файла package.json

При добавлении зависимости можно указать в какую из секций "dependencies" или "devDependencies" она будет записана. npm install karma --save-dev запишет зависимость в devDependencies, npm install express --save запишет в "dependencies"

Тут можно почитать больше обсуждения на английском.

Могу из “dependencies” установить все для прод версии билда

И из “devDependencies” я установлю вообще все используемые пакеты в проекте, типа для разработки

А как мне установить только пакеты для тестов?

По логике разработчиков зависимости тестов описаны в devDependencies, код который они тестируют зависит от dependencies. Поэтому для запуска тестов нужны зависимости и из dependencies и devDependencies. Не бывает случаев установки зависимостей только для тестов потому что тестируемый код зависит от dependencies.

В моем случае в карма конфиг передается уже сбилженый бандл проекта на angularjs

И я предполагал, что для корректной работы тестов им не нужны зависимости остального проекта

Идея была такова:

  1. Установить все модули для проекта -> собрать бандл проекта
  2. Установить модули для тестов -> в тесты загнать бандл из первого шага и запустить karma.config

Бандл, как я предполагаю, будет собираться прямо перед запуском тестов. Иначе придется городить систему которая будет гарантировать что тесты тестируют код со всеми недавними изменениями, а не тестируют старый бандл.

Или сетап выглядит иначе?

Бандл собирается прямо перед тестами, и тесты строго на нужном бандле.

Это все таски для тимсити, пытаюсь уменьшить время билдов

Сначала будут прогоняться все билды, тоже по отдельности(фронт, бек), а затем так же опционально можно прогнать тесты. Но время прогонки тестов нужно копировать всю папку нодмодулей из первого шага, а это занимает время

Получается нужны зависимости как для тестов так и для бандла. Если, конечно, в промежутке между сборкой и тестированием не сбрасывается окружение.

Попробуй кешировать устанавливаемые пакеты вместо разделения их установки. Просто использования yarn достаточно ибо он кеширует установленные пакеты на глобальном уровне. А чтобы билды не падали если нет доступа к npm.org, добавь возможность работы offline для yarn

Так для бандла уже не нужны никакие пакеты, они же уже все там внутри запаяны импортами

Я понял что бандл собирается в той же папке, в которой запускаются тесты и эти процессы - части одной таски тимсити. Т.е. процесс выглядит так:

  1. установить зависимости для prod и dev
  2. собрать бандл
  3. запустить тесты для бандла

Второе и самое главное - самое дорогое в установке пакетов - это http запросы к серверу и выкачивание пакетов. Если пакеты закешированы, то установка зависимостей проходит намного быстрее. Если в проекте зависимости уже закешированы, то разделение зависимостей для test и prod не даст ощутимой выгоды производительности.

Я не хочу решать задачу установки разных наборов пакетов потому что она нестандартна для экосистемы npm, как следствие решение будет плохо встраиваться в ожидания других частей системы.

А устанавливать пакеты всегда и кешировать их - лучший баланс между получаемым ускорением и простотой решения.

Поправь где я ошибаюсь, какие реальные шаги сборки

В разных папках, но артефакт и источник один и тот же

т.е. в результате билда получается артефакт, который используется на следующем шаге сборки - тестировании? И это происходит в одной папке на одной машине?

Я ошибся, ты выше писал что в разных.

В целом я считаю что задачу нужно решать через настройку кеширования пакетов. Может у ребят будет альтернативное мнение/идея.

1 лайк