Разница между "npm link x" и "npm install/path/to/x"

Я думал, что понимаю разницу между

npm link x

а также

npm install /local/path/to/x

Первоначально я думал, что первая создала символическую ссылку на x, в то время как последняя установила отдельную копию x в вашем проекте, а не символическую привязку.

Тем не менее, я недавно заметил, что мое первоначальное впечатление было неправильным, и оба они, похоже, используют символические ссылки - так есть ли разница между ними и что это такое?

Ответ 1

Итак, эта статья, по-видимому, сама излагает ее: https://medium.com/@the1mills/how-to-test-your-npm-module-without-publishing-it-every-5-minutes-1c4cb4b369be

В нем говорится, что разница между npm link x и npm install/local/path/to/x:

  1. Большая разница в том, что npm install/local/path/x будет запускать preinstall/postinstall hooks, но npm link x не будет.

  2. npm link использует глобальное пространство NPM, npm install/local/path/x нет. Ссылка npm создает символическую ссылку на x в глобальном пространстве, а затем, когда вы вызываете npm-ссылку x из y, она создает символическую ссылку не непосредственно на x, а скорее на глобальную символическую ссылку. Это важные различия, если вы используете разные глобальные версии node.js, например NVM.

  3. npm install/absolute/path/x будет изменять package.json, npm link x нет.

чтобы получить новую локальную копию вместо символической ссылки, используйте npm pack, например:

tgz="$PWD/$(npm pack)"
cd <other project>
npm install "$tgz"

вы также можете использовать cp/rsync, но это не будет запускать установочные крючки или помещать исполняемые файлы в node_modules/.bin..., которые будут делать свиньи.

Ответ 2

Ссылка на npm

npm link
npm link <folder>

Обе вышеупомянутая команда создаст символическую ссылку <folder> в глобальных пакетах.

Теперь npm link <folder> символизирует то же самое в папке node_modules и для вашего текущего проекта. И эти имена будут основаны на имени проекта в package.json и не будут основаны на имени папки, которую вы связываете

package.json вашего текущего проекта не будет затронут или изменен

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

https://github.com/nodejs/node/blob/31d5bdea70e44802918d6f4aa7c378bc1992be54/deps/npm/lib/link.js#L156

Итак, чтобы обобщить

  1. Он создает символическую ссылку в глобальной папке (всегда)
  2. Он не меняет package.json
  3. Он устанавливает любую из недостающих зависимостей

Установка npm

Теперь npm install <folder> немного отличается от этого

  1. Он не создает символическую ссылку в глобальной папке
  2. Он изменяет и добавляет ссылку на package.json
  3. Он создает символическую ссылку на исходную папку