Допустим, возникла ситуация, когда необходимо добавить устаревшее Node.js приложение в монорепозиторий, основанный на Nx. Например, все проекты в репозитории работают на Node 18 и yarn 3, а устаревшее приложение использует Node 14 и npm 6.
Как быть? Конечно, можно попробовать перенести проект на более новую версию Node.js и yarn, однако скорее всего это приведет к ошибкам сборки и, возможно, к ошибкам во время работы приложения.
Самое простое решение: изменить версию Node с помощью nvm перед выполнением скрипта. Для этого нужно изменить конфигурацию project.json, добавив executor, который будет запускать команду установки нужной версии Node:
{
"root": "packages/legacy-lib",
"targets": {
"install": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/legacy-lib",
"command": ". $HOME/.nvm/nvm.sh && nvm install v14.19.3 && npm install"
}
}
}
}
Если команда . $HOME/.nvm/nvm.sh
выдает ошибку permission denied, то нужно добавить права на выполнение с помощью команды chmod u+x $HOME/.nvm/nvm.sh
. Также можно описать этот случай в readme проекта.
Этот подход является самым простым в реализации, но его нужно применять для каждого target. Чтобы избежать этого, можно написать shell скрипт или создать собственный executor. Однако это займет больше времени и усилий, а также потребует поддержки в будущем. Подробнее о создании собственных executor можно узнать на странице https://nx.dev/recipes/executors/creating-custom-executors.
Бонусные советы:
- Для того, чтобы случайно не запустить проект с помощью неправильной версии Node.js и не испортить lock файл, можно добавить органичения с помощью поля engines в package.json и файла .npmrc со значением
engine-strict=true
.
- Чтобы запускать проект, используя nvm, не только с помощью Nx, можно добаивть nvmrc файл с указанием версии, например, v14.19.3. После этого можно заменить команду
nvm install v14.19.3
на nvm install
(версия будет определна автоматически).
- Чтобы иметь возможность передавать агрументы устаревшим npm скриптам с помощью Nx, необходимо добавить
--
в конец команды, например, npm run dev --
.