DerZyklop
DerZyklop

Reputation: 3813

Edit package.json from command line

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

Answers (7)

Aakash
Aakash

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

Shl
Shl

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

enrico.bacis
enrico.bacis

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.

Example

$ 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

ralfstx
ralfstx

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

Zeke
Zeke

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

Amy Guo
Amy Guo

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

Bertrand Martel
Bertrand Martel

Reputation: 45372

You can also use 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

Related Questions