Andrew Ferrier Andrew Ferrier - 1 year ago 64
JSON Question

How do I find out what version of a bower package is actually installed?

Normally a

file specifies some dependencies, but these are typically expressed so that they allow a range of versions of a bower package to be used (e.g.
, which means anything higher than version 1.0).

I have an automated process which needs to find what version of a bower package is actually installed on this system right now.

How can I find this out programmatically (just the version itself), ideally using standard Unix command line tools / the bower command?

bower info <thepackagename>
does not show this - it shows information about what is currently available from the bower repository (for example, even if I do
bower info apackageIdonthaveinstalled
it will still show a valid JSON structure containing a version number).

cat bower_components/thepackagename/bower.json | node_modules/json/lib/json.js version
works for some packages (assuming the npm package
is installed), but not all (e.g. jquery 2.2.0's bower package does not contain a bower.json).

Answer Source

The best approach I've now found, which seems to work for every package I've come across so far, is:

cat bower_components/thepackagename/.bower.json | node_modules/json/lib/json.js version

(note the extra . in .bower.json).

It would appear that bower stores some metadata about the installed package in .bower.json, and that includes the installed version.

The best I've come up with so far is:

bower list | grep jquery | perl -pe 's/.*jquery#(.*?) .*$/$1/'

(if, for example, the package I was interested in was jquery).

That's pretty ugly for a variety of reasons:

  • I have to repeat the package name (although this could probably be improved with a better Perl script which filters lines too, I'm just being lazy).

  • bower list gets information about all installed packages, not just the one I'm interested in - the rest of the information is discarded.

  • bower list seems to require internet connectivity to check the registry, otherwise it fails.

Would be interested to see if this could be improved upon, particularly the last point.