Одновременная работа над приложением и зависимостью

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

Вы можете внести изменения в node_modules и вручную скопировать изменения в git репозиторий зависимости, как только вы закончите. Но есть более чистый подход: npm link.

использование

Связывание пакетов - это двухэтапный процесс:

  1. Создайте глобальную символическую ссылку для зависимости с npm link. символическая ссылка, сокращение от symbolic link, - это ярлык, указывающий на другой каталог или файл в вашей системе.
  2. Скажите приложению использовать глобальную символическую ссылку с npm link some-dep.
cd ~/projects/some-dep
npm link  # Step 1.
cd ~/projects/my-app
npm link some-dep  # Step 2.

Вы можете редактировать, транспилировать, запускать тесты или фиксировать как обычно в some-dep. Все это время my-app работает с изменениями, внесенными вами в some-dep. Символические ссылки являются локальными и не будут привязаны к git. Когда вы будете готовы поделиться своим кодом, опубликуйте новую версию some-dep или отправьте в ветку, указанную в my-app’s package.json:

cd ~/projects/my-app
npm install — save some-dep@fhinkel/some-dep#experimental-branch

Отладка

Если вы используете VSCode и хотите установить точки останова в some-dep, вам необходимо включить символические ссылки в отладчике для my-app. Сделайте это, установив

“runtimeArgs”: [
  “--preserve-symlinks”
]

in launch.json.

Вернуться к нормальному

Как вернуться к нормальным зависимостям? Если вы больше не хотите использовать локальную версию some-dep, удалите символическую ссылку. Но будьте осторожны, npm unlink - это псевдоним для npm uninstall, он не отражает поведение npm link.

cd ~/projects/my-app
npm uninstall --no-save some-dep && npm install 

Вы можете очистить глобальную ссылку, но ее наличие не помешает my-app.

cd ~/projects/some-dep
npm uninstall  # Delete global symlink

Заключение

Я использовал npm link при работе над зависимостями клиентских библиотек для Google Cloud Platform. Все наши библиотеки используют модуль @google-cloud/common. В некоторых случаях мне нужно было сразу увидеть изменения в более крупных библиотеках, а не изолированно в common.

Освоение двухэтапного процесса npm link - полезное дополнение к набору инструментов любого разработчика Node.js. Процесс состоит из выполнения npm link в зависимости и npm link some-dep в приложении.

Огромное спасибо Питеру Маршаллу и Александру Фенстеру за помощь в редактировании этого сообщения.