Easy way to list node modules I have npm linked?

2020-05-11 16:12发布

问题:

I am looking for a command that will list the names of global modules that I have npm link'd to local copies, also listing the local path.

In fact, a list of all globally installed modules would be even better, with the npm link'd ones flagged somehow.

回答1:

Did you try just listing the node_modules directory contents (e.g. ls -l node_modules | grep ^l)? They're normal symlinks.

If you really need to find all symlinks, you could try something like find / -type d -name "node_modules" 2>/dev/null | xargs -I{} find {} -type l -maxdepth 1 | xargs ls -l.



回答2:

To list all globally linked modules, this works (documentation https://docs.npmjs.com/cli/ls):

npm ls -g --depth=0 --link=true

I had to update the version of npm on my machine first, though:

npm install npm@latest -g


回答3:

A better alternative to parsing ls is to use find like this:

find . -type l

You can use -maxdepth 1 to only process the first directory level:

find . -maxdepth 1 -type l

You can use -ls for additional info.

For instance, for finding node modules that are npm linked:

find node_modules -maxdepth 1 -type l -ls

Here's an article why parsing ls is not the best idea



回答4:

If you want a nice colored output from npm list, you may like:

\ls -F node_modules | sed -n 's/@$//p' | xargs npm ls -g --depth 0

which gives in my current playground dir:

+-- color@0.11.1 
+-- grunt@0.4.5
+-- http-server@0.8.5 
+-- jsdom@8.0.2 
+-- jsonfile@2.2.3 
+-- underscore@1.8.3 
+-- xmlserializer@0.3.3 
`-- zombie@4.2.1 

It makes a few assumptions but it should work in most cases, or be easy to adapt with the explanations below.

  • use \ls to bypass possible aliases on your ls command
  • the -F option adds an '@' indicator for links
  • the sed command selects those links and removes the indicator
  • the xargs part passes previous output as arguments to npm ...
  • npm is invoked with
    • list or ls to list modules with versions
      • replace with ll to get details about each listed module.
    • -g for the global modules and
    • --depth 0 for a shallow listing (optional)
    • --long false (default with 'list').

Issue: for some reason npm gives extraneous entries for me at the moment (non colored). They would be those I had "npm unlink"ed.

For "a list of all globally installed modules" in current npm path, you just do

npm list -g

For further needs you may want to have a look at

npm help folders

You cannot follow symlinks backwards unless you scan your whole filesystem and (then that's not a npm specific question).

For quickly finding files and directories by name, I use locate which works on an index rebuilt usually once a day.

locate '*/node_modules'

and start working from there (you may want to refine the search with --regexp option.



回答5:

I found this question after I also wrote my own tool, here it is for completeness: npm-list-linked.

It will recursively follow all linked packages down in the hierarchy as well, at my work we sometimes may have npm link 2-3 levels deep and this way you can see exactly which are local and which ones are not, avoids surprises.

$ npm-list-linked
Linked packages in /home/user/projects/some-project/
    @prefix/package 0.2.7
        other-package 0.1.2


回答6:

I made a Node.js module that uses fs to check for symlinks made by npm link or otherwise.

https://www.npmjs.com/package/symlinked

var symlinked = require("symlinked")

console.log(symlinked.names())


回答7:

I see myself and others having this same question a lot. I wrote a small CLI for myself called link-status to display this info, it may help others out too! Check it out here!



回答8:

find `npm root -g` -maxdepth 2 -type l

to show global links, including namespaced packages.

@andrew's answer works some of the time:

npm ls -g --depth=0 --link=true

but blew up on peer dep errors for me on some occasions. Hope that helps someone!



标签: node.js npm