Skip to content

Instantly share code, notes, and snippets.

@DarrenN
Forked from yvele/get-npm-package-version.sh
Last active June 20, 2025 19:20
Show Gist options
  • Select an option

  • Save DarrenN/8c6a5b969481725a4413 to your computer and use it in GitHub Desktop.

Select an option

Save DarrenN/8c6a5b969481725a4413 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')
echo $PACKAGE_VERSION
@appurist

Copy link
Copy Markdown

@Coridyn Can you edit to fix the typo ("pgk" should be "pkg" everywhere)?
And thanks for that comment that we

can use --workspaces=false to turn off this behaviour and return a consistent result.

npm pkg get version --workspaces=false seems to work consistently and doesn't require even my very brief node script in order to be cross-platform. 💯

@ThePlenkov

Copy link
Copy Markdown

npm pkg get version --workspaces=false seems to work consistently and doesn't require even my very brief node script in order to be cross-platform. 💯

the only issue is - it's still doesn't support format without quotes, sometimes is needed to use version somewhere else in other variables and those quotes break everything

@Coridyn

Coridyn commented Mar 19, 2023

Copy link
Copy Markdown

I've updated my previous comment, but in case the update gets missed I'm repeating it here:

Get the unquoted version string

If you're in a *nix-like environment (Linux, OSX, gitbash), then it's possible to use the tr utility to trim the " quote characters from the string.

Here the one-liner I use to get the unquoted version:

$ npm pkg get version --workspaces=false | tr -d \"

1.0.4220

You can assign to a variable (e.g. in a shell script):

LIB_VERSION=$(npm pkg get version --workspaces=false | tr -d \")

@travispaul

Copy link
Copy Markdown

Since no one has mentioned it yet, I'll throw my solution into the ring:

node -e "process.stdout.write(require('./package').version)"

It's rather unfortunate the that the npm pkg get command is almost usable but I'd rather not have to pipe to tr to remove the double quotes.

@tommyc38

Copy link
Copy Markdown

Here is how I get the lockfile version in my bash script...

lockfile_version="$(node -pe "require(\"$directory/package-lock.json\").lockfileVersion" )"

@o-az

o-az commented Apr 22, 2023

Copy link
Copy Markdown
node --print 'require("./package.json").version'
sed -n 's/.*"version": *"\([^"]*\)".*/\1/p' package.json
node --eval 'process.stdout.write(require("./package.json").version)'

@justinmchase

Copy link
Copy Markdown

I just wanted to add an alternative solution I came up with: https://github.com/optum/semver-cli

This is a tool dedicated to getting/setting/incrementing semantic versions. It also has the ability to synchronize various code files as you increment which then makes it easier to access the version from code in different ways.

.github/version.yml

on:
  post:
    - kind: patch
      file: package.json
    - kind: regexp
      pattern: '(?<=export const version = ").*(?=";)'
      file: src/version.js
    - kind: regexp
      pattern: '(?<=example@).*(?=\/main.js)'
      file: README.md

src/version.js

export const version = "0.1.0";

README.md

# Example
```js
import * as example from "example@0.1.0";
```

package.json

{
  "version": "0.1.0"
}

VERSION

0.1.0

Then to get it from the shell:

VERSION=$(semver get)

To get it in code:

main.js

import { version } from "./src/version.js";
console.log(version);

And packagej.son, package-lock.json, src/version.js, README.md and the VERSION file are all in sync with each other and can be incremented simultaneously with the following command:

semver inc minor

Which will set them all to 0.2.0 of course.

@lakouu

lakouu commented Dec 1, 2023

Copy link
Copy Markdown

This worked for me
cat package.json | grep \"version\" | cut -d'"' -f 4

@HikaruChang

Copy link
Copy Markdown

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

@Ostico

Ostico commented Apr 17, 2024

Copy link
Copy Markdown

cat package.json | jq -r '.version' works on github actions

Easier:
jq -r .version package.json

real	0m0,021s
user	0m0,020s
sys	0m0,000s

@showmeyourhits

Copy link
Copy Markdown

If someone uses image based on ubi-minimal - which doesn't have jq, grep or even sed - use this script:

VERSION=$(cat package.json | tr -d '\n' | tr -d ' ' | cut -d'"' -f4)

@han911976

han911976 commented Aug 8, 2024

Copy link
Copy Markdown
grep "version" package.json | ...

grep directly instead of cat?

@getify

getify commented Sep 6, 2024

Copy link
Copy Markdown

Thanks for this thread, lots of creative workarounds and useful techniques to be learned here.

However, I think the best option, at least for the OP task, got largely overlooked here. npm show ./ version (as pointed out by @mightyiam among others).

BTW, the actual command AFAICT is npm-view, and there it says that npm has aliased v, show, and info to it.

WARNING: npm show . version and npm show ./ version are different. The . seems to pull from the published repository info (in cache?), where as the ./ actually reads the package.json in the current directory. The latter is the one we want here (at least the OP). So make sure you use npm show ./ version.

FWIW, I have added these two to my ~/.bash_profile:

alias whatver="npm v ./ version"
alias tagver="whatver | xargs git tag && git push --tags"

(I always forget how useful xargs is, until I run across a case like this where it's helpful)

@david-tennant-reaktor

Copy link
Copy Markdown

If you already have node installed: node -p "require('./package.json').version"

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