-
Star
(349)
You must be signed in to star a gist -
Fork
(42)
You must be signed in to fork a gist
-
-
Save DarrenN/8c6a5b969481725a4413 to your computer and use it in GitHub Desktop.
# 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 |
@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.
@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.
@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.
I've registered the suggestion here for npm pkg get version --raw
npm/cli#5508
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)
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
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.
thanks @iamludal , I unfortunately dont/cant have jq
in the pipeline, is there anyway I can without it ?
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.
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
A bit shorter:
yarn version --non-interactive | grep "Current version:" | awk '{ print $4 }
cat node_modules//package.json | jq -r ".version"
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"
}
}
@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
@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. 💯
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
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 \")
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.
Here is how I get the lockfile version in my bash script...
lockfile_version="$(node -pe "require(\"$directory/package-lock.json\").lockfileVersion" )"
node --print 'require("./package.json").version'
sed -n 's/.*"version": *"\([^"]*\)".*/\1/p' package.json
node --eval 'process.stdout.write(require("./package.json").version)'
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.
This worked for me
cat package.json | grep \"version\" | cut -d'"' -f 4
node -p -e "require('./package.json').version"
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
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)
grep "version" package.json | ...
grep
directly instead of cat
?
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)
If you already have node installed: node -p "require('./package.json').version"
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.