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 Симпатия

В файле package.json , с помощью которого Yarn и npm отслеживают зависимости, номера версий не указываются точно, вместо этого задается их диапазон. Таким образом, вы можете задать определенную основную или вспомогательную версию, при этом позволяя npm установить последний патч https://fileext.info/extension/nw с исправлениями каких-либо багов.