【问题标题】:Edit package.json from command line从命令行编辑 package.json
【发布时间】:2014-10-09 08:32:17
【问题描述】:

我正在尝试通过 shell 脚本在我的 package.json 中添加或编辑变量。因此,如果我有这样的 package.json:

{
  "name": "my-project",
  "description": "Project by @DerZyklop",
  "version": "0.0.0",
  ...

我想要一个类似的命令

npm config set foo bar

添加一个新字段,如

{
  "name": "my-project",
  "description": "Project by @DerZyklop",
  "foo": "bar",
  "version": "0.0.0",
  ...

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

【问题讨论】:

  • 你可以用 nano 打开它并手动编辑它...
  • @MightyPork 对不起,如果我表达得不够好。最后,我想要一个 shell 脚本(在其他任务中)编辑 package.json 中的一个值。

标签: json node.js npm


【解决方案1】:

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

npm install -g json

然后您可以就地编辑文件。更多信息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"
}

【讨论】:

  • 非常感谢您的帮助。虽然我已经在节点like this 中编写了我的脚本。但我也测试了你的提议,它也很有效。
  • “bar”如何成为变量而不是具体值?尝试使用环境变量但没有替换它
  • @masimakopoulos:假设您在谈论 bash,字符串插值仅适用于双引号字符串。所以你需要像这样交换单引号和双引号:"this.foo='$A'"。 (这是正常的 bash 行为,因此您可以使用 echo "this.foo='$A'" 对其进行测试)
  • 谢谢。我使用您的方法在我的 package.json 中添加了指向 index.js 脚本的默认“开始”键(这不是 Yarn 包含的默认值,但在运行我的 Docker 映像时被调用)npm install -g json; json --in-place -f package.json -e 'this.scripts={"start": "node index.js"}'
  • 由于此处描述的引用问题,示例对我不起作用(某些内容必须更改):github.com/trentm/json/issues/117#issuecomment-322848900 - 对我有用的命令使用这样的双引号:json -I -f package.json -e "this.foo=\"bar\""
【解决方案2】:

您也可以像这样使用sponge(moreutils 包):

jq '.foo="bar"' package.json | sponge package.json

使用环境变量:

jq --arg h "$HOMEPAGE" '.homepage=$h' package.json | sponge package.json

【讨论】:

    【解决方案3】:

    如果你不想安装spongejson,你也可以这样做

    echo "`jq '.foo="bar"' package.json`" > package.json
    

    【讨论】:

    • 我喜欢这个 ;)
    【解决方案4】:

    还有一个用于执行此操作的 npm 包,称为 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
    

    【讨论】:

    • 是否可以删除密钥?
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      # this sets the version 
      # in package.json to 1.0.2
      npm version 1.0.2 
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 2013-03-20
      • 2014-12-24
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多