Reputation: 3813
I'm trying to add or edit a variable in my package.json from a shell script. So if i have a package.json like this:
{
"name": "my-project",
"description": "Project by @DerZyklop",
"version": "0.0.0",
...
I want a command like
npm config set foo bar
that adds a new field like
{
"name": "my-project",
"description": "Project by @DerZyklop",
"foo": "bar",
"version": "0.0.0",
...
...but unfortunately npm config set
just edits the ~/.npmrc
and not my package.json.
Upvotes: 80
Views: 64449
Reputation: 23737
I wanted to update only the version
property in package.json
and this is what worked for me:
# this sets the version
# in package.json to 1.0.2
npm version 1.0.2 # creates a git-tag too
npm version 1.0.2 --no-git-tag-version # only changes the version without creating a git-tag
Upvotes: 11
Reputation: 3688
You do have a native NPM command:
npm pkg set 'scripts.test'='jest'
Which is really helpful when you want to share a command. Instead of asking someone to install some cli tool, you can simply share this.
BTW, it's even more helpful when you use NPM workspaces, in which case you can change all the packages together:
npm pkg set 'scripts.test'='jest' -ws
Upvotes: 65
Reputation: 31494
The package.json
is just a json
file, so you could use the tool json
. To install it use:
npm install -g json
Then you can edit a file in-place. More information here.
$ cat package.json
{
"name": "my-project",
"description": "Project by @DerZyklop",
"version": "0.0.0"
}
$ json -I -f package.json -e "this.foo=\"bar\""
json: updated "package.json" in-place
$ cat package.json
{
"name": "my-project",
"description": "Project by @DerZyklop",
"version": "0.0.0",
"foo": "bar"
}
Upvotes: 106
Reputation: 4023
If you don't want to install anything, you can also use a one-line script to modify the package.json
:
node -e "let pkg=require('./package.json'); pkg.homepage='${CI_PAGES_URL}'; require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2));"
Upvotes: 19
Reputation: 1448
There's also a npm package for doing this called npe
: https://github.com/zeke/npe
cd some/node/project
# Get stuff from package.json
npe name
npe scripts
npe scripts.test
npe repository.url
open $(npe repository.url)
# Set stuff in package.json
npe name foo
npe scripts.start "node index.js"
# Keywords string will be turned into an array
# If commas are present, they'll be the delimiter. Otherwise spaces.
npe keywords "foo, bar, cheese whiz"
npe keywords "foo bar baz"
# The current working directory's package.json is used by default,
# but you can point to another package file with a flag:
npe name --package=some/other/package.json
npe name other --package=some/other/package.json
Upvotes: 4
Reputation: 151
If you don't want to install sponge or json, you can also do
echo "`jq '.foo="bar"' package.json`" > package.json
Upvotes: 14
Reputation: 45372
You can also use jq and sponge (moreutils package) like this :
jq '.foo="bar"' package.json | sponge package.json
With an environment variable :
jq --arg h "$HOMEPAGE" '.homepage=$h' package.json | sponge package.json
Upvotes: 10