从命令行编辑package.json

Der*_*lop 41 json node.js npm

我正在尝试从shell脚本中添加或编辑package.json中的变量.所以如果我有这样的package.json:

{
  "name": "my-project",
  "description": "Project by @DerZyklop",
  "version": "0.0.0",
  ...
Run Code Online (Sandbox Code Playgroud)

我想要一个像这样的命令

npm config set foo bar
Run Code Online (Sandbox Code Playgroud)

这增加了一个新的领域

{
  "name": "my-project",
  "description": "Project by @DerZyklop",
  "foo": "bar",
  "version": "0.0.0",
  ...
Run Code Online (Sandbox Code Playgroud)

...但不幸的是npm config set只编辑了~/.npmrc而不是我的package.json.

enr*_*cis 70

package.json只是一个json文件,因此您可以使用该工具json.要安装它,请使用:

npm install -g json
Run Code Online (Sandbox Code Playgroud)

然后,您可以就地编辑文件.更多信息在这里.

$ 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"
}
Run Code Online (Sandbox Code Playgroud)

  • 由于此处描述的引用问题,示例对我不起作用(某些东西必须已更改):https://github.com/trentm/json/issues/117#issuecomment-322848900 - 对我有用的命令是使用双引号像这样: json -I -f package.json -e "this.foo=\"bar\"" (5认同)
  • @masimakopoulos:假设您在谈论 bash,字符串插值仅适用于双引号字符串。所以你需要像这样交换单引号和双引号:`"this.foo='$A'"`。(这是正常的 bash 行为,因此您可以使用 `echo "this.foo='$A'"` 对其进行测试) (2认同)

Shl*_*Shl 52

您确实有一个本机 NPM 命令:

npm pkg set 'scripts.test'='jest'
Run Code Online (Sandbox Code Playgroud)

当您想要共享命令时,这确实很有帮助。您可以简单地分享这个工具,而不是要求别人安装一些 cli 工具。

顺便说一句,当您使用NPM 工作区时,它会更有帮助,在这种情况下,您可以一起更改所有包:

npm pkg set 'scripts.test'='jest' -ws
Run Code Online (Sandbox Code Playgroud)

  • 现在是 2022 年,这应该是公认的答案。这是最简单的,完全按照问题的要求进行操作,并且不使用任何额外的工具。 (14认同)

Aka*_*ash 10

我只想更新version其中的属性package.json,这对我有用:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 请记住,它[还为该版本创建标签](https://docs.npmjs.com/cli/v7/commands/npm-version#description)。如果不需要,请使用“--no-git-tag-version”。 (4认同)

Amy*_*Guo 9

如果你不想安装海绵json,你也可以这样做

echo "`jq '.foo="bar"' package.json`" > package.json
Run Code Online (Sandbox Code Playgroud)


Ber*_*tel 8

您还可以像这样使用海绵(moreutils 包):

jq '.foo="bar"' package.json | sponge package.json
Run Code Online (Sandbox Code Playgroud)

使用环境变量:

jq --arg h "$HOMEPAGE" '.homepage=$h' package.json | sponge package.json
Run Code Online (Sandbox Code Playgroud)


ral*_*stx 7

如果不想安装任何东西,也可以使用单行脚本修改package.json

node -e "let pkg=require('./package.json'); pkg.homepage='${CI_PAGES_URL}'; require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2));"
Run Code Online (Sandbox Code Playgroud)