Skip to content

Instantly share code, notes, and snippets.

@yvele
Last active April 27, 2024 04:19
Show Gist options
  • Save yvele/e98e3a155335a6e00e71 to your computer and use it in GitHub Desktop.
Save yvele/e98e3a155335a6e00e71 to your computer and use it in GitHub Desktop.
Extract version from package.json (NPM) using bash / shell
# Version key/value should be on his own line
PACKAGE_VERSION=$(cat package.json \
| grep version \
| head -1 \
| awk -F: '{ print $2 }' \
| sed 's/[",]//g' \
| tr -d '[[:space:]]')
echo $PACKAGE_VERSION
@melarts
Copy link

melarts commented Oct 9, 2019

If I may, if fixed the regex for sed because per example if my package version was : v6.0.0-dev.3, I would get 6.0.0-d.3 as a result because "version" was not targeted as a full word.
And I had to add -E for the regex pipe to be understood

My change :

PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F= "{ print $2 }" | sed -E 's/(version)|[:,\",]//g' | tr -d '[[:space:]]')

@damlys
Copy link

damlys commented Apr 26, 2020

node --eval="process.stdout.write(require('./package.json').version)" do the job. Full example:

$ pwd
/home/damlys/workspace/get-npm-package-version
$ ls
package.json
$ cat package.json
{
  "name": "myapp",
  "version": "0.1.0-rc.1+5398d0bde599de3ed5fc87e41af208e4754cbd52",
  "private": true
}
$ node --eval="process.stdout.write(require('./package.json').version)"
0.1.0-rc.1+5398d0bde599de3ed5fc87e41af208e4754cbd52$ export PACKAGE_VERSION=$(node --eval="process.stdout.write(require('./package.json').version)")
$ echo $PACKAGE_VERSION
0.1.0-rc.1+5398d0bde599de3ed5fc87e41af208e4754cbd52
$ echo "v${PACKAGE_VERSION}_FOO_BAR_BAZ"
v0.1.0-rc.1+5398d0bde599de3ed5fc87e41af208e4754cbd52_FOO_BAR_BAZ
$

@hfsaito
Copy link

hfsaito commented May 23, 2020

node -pe "require('./package.json').version"

$ node -pe "require('./package.json').version"
4.10.4

@hejmsdz
Copy link

hejmsdz commented May 23, 2020

Node or any any other programming language interpreter with JSON support will handle unusual whitespaces correctly like in this case:

{"version"
: "1.0.0"
}

That's a big win, but such solution involves loading the whole language runtime into memory. The difference may go unnoticed on modern hardware, although it's still something to keep in mind.

If you need something just as robust, but more lightweight, then jq is an excellent tool :)

$ jq -r .version package.json

@dezren39
Copy link

dezren39 commented Jul 5, 2020

I combined all the examples here but also elsewhere into one big page, no idea what is best, but if it's useful to someone:

https://gist.github.com/dezren39/d71e381a3c70ce8463a9471cd2983617

# these can all be npm scripts, but anything can be an npm script

# a
echo $(cat ./package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]')
# b
echo $(cat ./package.json | grep version | head -1 | awk -F= "{ print $2 }" | sed -E 's/(version)|[:,\",]//g' | tr -d '[[:space:]]')

# c
echo $(node --eval="process.stdout.write(require('./package.json').version)")

# d
node -pe "require('./package.json').version"

# e
jq -r .version ./package.json

# f
npm run version --silent # add version run-script to scripts: ' "version": "echo $npm_package_version" ' # also could access $npm_package_version any other way

# g not clean
npm version

# if published package, to check published package
# h
npm view . version
# i
npm show . version

# j
awk -F\" '/"version":/ {print $4}' package.json
# k
npx -c 'echo "$npm_package_version"'
# l
perl -ne 'print "$1\n" if /"version":\s*"(.*?)"/' package.json
# m
awk '/version/{gsub(/("|",)/,"",$2);print $2}' package.json
# n
sed -nr 's/^\s*\"version": "([0-9]{1,}\.[0-9]{1,}.*)",$/\1/p' package.json

#---

# npm package example, others exist

npm i -g json

# o (requires "npm i -g json")
json version -a < package.json

# p (requires "npm i -g json")
json dependencies -a < package.json | grep : | sed 's/^ *//;s/"//g;s/: /@/;s/,$//'
# q (requires "npm i -g json")
json dependencies -a < package.json | grep : | sed 's/[",]//g;s/: /@/;s/,$//'

# r (requires "npm i -g json")
json devDependencies -a < package.json | grep : | sed 's/^ *//;s/"//g;s/: /@/;s/,$//'

# s (requires "npm i -g json")
json devDependencies -a < package.json | grep : | sed 's/[",]//g;s/: /@/;s/,$//'

#---

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment