Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

originally I thought the former created a symlink to x, whereas the latter installed a separate copy of x in your project, instead of symlinking it.

However, I recently noticed that my original impression was wrong, and they both seem to use symlinks - so is there a difference between the two and what is it?

An article on Medium by Alex Mills lays it out bare.

It says the difference between npm link x and npm install /local/path/to/x are:

  • The big difference is that npm install /local/path/x will run the preinstall/postinstall hooks, but npm link x will not.

  • npm link uses the global NPM space, npm install /local/path/x does not. npm link creates a symlink to x in the global space, and then when you call npm link x from y, it creates a symlink not directly to x, but rather to the global symlink. This is an important differences if you are using different global node.js versions, e.g., NVM.

  • npm install /absolute/path/x will alter package.json, npm link x does not.

  • To get a fresh local copy instead of a symlink, use npm pack , like so:

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

    You could also use cp/rsync, but that wouldn't run install hooks or put the executables in node_modules/.bin...that will work.

    it's not my article, it must be a different guy named Alex Mills, weird didn't notice that before, happy with the credit tho! – Alexander Mills Mar 21, 2019 at 1:49 npm link <folder>

    Both of the above command will create a symlink of the <folder> in the global packages.

    Now npm link <folder> will symlink the same in your node_modules folder also for your current project. And these names would be based on project name in package.json and not based on the folder name you are linking

    The package.json of your current project will not be touched or altered

    The dependencies of the package will still be installed as you can see in the code here

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

    So to summarize:

  • It creates a symlink in the global folder (always).
  • It doesn't alter the package.json.
  • It does install any of missing dependencies.
  • npm install

    Now npm install <folder> is a bit different to this:

  • It doesn't create a symlink in the global folder.
  • It alters and adds the reference to package.json.
  • It creates a symlink to original folder.
  • Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.