Skip to content

Instantly share code, notes, and snippets.

@DarrenN
Forked from yvele/get-npm-package-version.sh
Last active March 7, 2024 16:53
Star You must be signed in to star a gist
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
@acrogenesis
Copy link

acrogenesis commented May 5, 2022

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

@iamludal
Copy link

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

This is the best solution!

@bmerigan
Copy link

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

This is the best solution!

Not the best IMO because you need to install additional software for it to work (jq)

@appurist
Copy link

I'm with @bmerigan, jq is not cross-platform or installed by default (and not available on Windows). This is why I ended up using that 3-line Node.js script, because it can be assumed that Node.js is installed here, and is cross-platform.

@iamludal
Copy link

Well you're right, I should have been more precise: this is the best solution for my use case, because I'm using it in GitHub Actions, and jq is installed by default.

@mr-kelly
Copy link

awk -F'"' '/"version": ".+"/{ print $4; exit; }' package.json

This solution is greatest and can be suited for a special situation:

My package.json has more than one key element with "version" string.

@cmario92
Copy link

cmario92 commented Jul 5, 2022

any example that we can wrap any of the above solutions in a sh command?
The goal for me is to extract the package.json version in a jenkinsfile.

@appurist
Copy link

appurist commented Jul 5, 2022

@cmario92 my simple solution only had a dependency on Node.

It's easy to change the output node make_version.js > src/version.js to be a different language or json file or append to a jenkinsfile etc.

@Coridyn
Copy link

Coridyn commented Aug 18, 2022

@appurist npm pkg get version will return different results depending on whether the project is configured inside a workspace or not.

Using your example, if the project is not in a workspace:

$ npm pkg get version

"1.0.4220"

If inside a project:

$ npm pkg get version

{
  "desk-app": "1.0.4220"
}

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

# If project is inside a workspace
$ npm pkg get version --workspaces=false

"1.0.4220"

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 \")

@appurist Thanks for picking up the typo, that's been updated now.

@appurist
Copy link

appurist commented Aug 18, 2022

@Coridyn Thanks! That makes sense. So --workspaces=false is in fact what I was looking for. In some ways have the small bit of node.js code is simple and more stable for the long term, or at least less likely to ever be a problem unless we change it, but it's great to know how to actually use pkg get version in a consistent manner too. Thanks for that bit of info. I'll probably switch to that at some point, or at least for future projects.

@ThePlenkov
Copy link

I've registered the suggestion here for npm pkg get version --raw npm/cli#5508

@slavdok
Copy link

slavdok commented Oct 6, 2022

npm pkg get version

That returns "0.1.0" unlike "version": "echo $npm_package_version"
You are chastising the answer saying it's OS dependent, but then with npm pkg get version how would you strip the quotes in an OS independent way?

BTW "version": "echo $npm_package_version" and then yarn version works in Linux AND Windows (PowerShell and even CMD)

@ThePlenkov
Copy link

@slavdok here is the discussion about implementing npm pkg get version --parseable. Currently is not possible with npm, that's correct.

@NikhilNanjappa
Copy link

NikhilNanjappa commented Jan 17, 2023

Could I use the scripts above to get version from an absolute path of a package file ?

.ie. get version from https://gitlab.com/my-org/my-group/my-repo/-/raw/main/package.json

@iamludal
Copy link

Could I use the scripts above to get version from an absolute path of a package file ?

.ie. get version from https://gitlab.com/my-org/my-group/my-repo/-/raw/main/package.json

You could make a curl or wget and pipe it to jq for example.

@NikhilNanjappa
Copy link

thanks @iamludal , I unfortunately dont/cant have jq in the pipeline, is there anyway I can without it ?

@iamludal
Copy link

thanks @iamludal , I unfortunately dont/cant have jq in the pipeline, is there anyway I can without it ?

You can use grep then, something like: grep -oP '(?<="version": ")([\d\.]+)(?=")'. This is just a simple regex for X.Y.Z versions, it does not handle special versions (1.2.3-beta, 4.5.6-rc1), but you have the idea.

@cglacet
Copy link

cglacet commented Feb 6, 2023

If you are using yarn you can use the version command to get it.

❯ yarn version --non-interactive
yarn version v1.22.19
info Current version: 4.1.0

I haven't found a nice way to get the version number appart from this ugly hack:

❯ yarn version --non-interactive | grep 'info Current version' | rev | cut -d' ' -f 1 | rev
4.1.10

@vyazadji
Copy link

A bit shorter:

yarn version --non-interactive | grep "Current version:" | awk '{ print $4 }

@mtavkhelidze
Copy link

cat node_modules//package.json | jq -r ".version"

@cglacet
Copy link

cglacet commented Feb 14, 2023

I think I found a less hacky way of doing this, you could use package.json internally defined environement variable nammed npm_package_version to add the following script:

{
  "name": "package",
  "version": "4.1.0",
  "scripts": {
    "app:version": "echo $npm_package_version"
  }
}

Which could then be used this way:

❯ yarn --silent app:version
4.1.0

To make sure it works on windows too, we could use npm/cross-var:

{
  "name": "package",
  "version": "4.1.0",
  "scripts": {
    "app:version": "cross-var echo $npm_package_version"
  }
}

@CreativeWarlock
Copy link

@appurist npm pkg get version will return different results depending on whether the project is configured inside a workspace or not.

Using your example, if the project is not in a workspace:

$ npm pgk get version

"1.0.4220"

If inside a project:

$ npm pgk get version

{
  "desk-app": "1.0.4220"
}

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

# If project is inside a workspace
$ npm pgk get version --workspaces=false

"1.0.4220"

Please note this tip has a typo:
npm pgk get version
should be
npm pkg get version

@appurist
Copy link

@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

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
Copy link

Coridyn commented Mar 19, 2023

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

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

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

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

@o-az
Copy link

o-az commented Apr 22, 2023

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

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
Copy link

lakouu commented Dec 1, 2023

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

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