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\",
\"descripti
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"
}
If you don't want to install sponge or json, you can also do
echo "`jq '.foo="bar"' package.json`" > package.json
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
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
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));"