Last active
April 27, 2024 04:19
-
-
Save yvele/e98e3a155335a6e00e71 to your computer and use it in GitHub Desktop.
Extract version from package.json (NPM) using bash / shell
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
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
$
node -pe "require('./package.json').version"
$ node -pe "require('./package.json').version"
4.10.4
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
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
If I may, if fixed the regex for sed because per example if my package version was :
v6.0.0-dev.3
, I would get6.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 understoodMy change :
PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F= "{ print $2 }" | sed -E 's/(version)|[:,\",]//g' | tr -d '[[:space:]]')