有npm cli选项从本地package.json获取包名称吗?

问题描述 投票:0回答:5

我想从命令行上的

package.json
获取详细信息。一个例子:

$ cd ~/my-node-package
$ npm commandiamlookingfor package name
my-package-name

我知道这将是一个简单的脚本。我可以这样做:

node -e "try {var pack=require('./package.json'); console.log(pack.name); } catch(e) {}"

但是任何我不必编写(和维护)的代码都是最好的代码。另外,由于我想将其用于 shell 集成,因此它会运行很多次;本机实现可能会更快。

npm package.json
5个回答
20
投票

NPM 有它存储的环境变量。您可以通过在控制台中输入

npm run env
来查看这些内容。

您可以使用它通过 grep

npm_package_name
来获取所需的变量,但这会给您留下“npm_package_name=your_package_name”。

解决这个问题的一种方法是使用以下命令获取“=”字符后面的子字符串:

cut -d "=" -f 2 <<< $(npm run env | grep "npm_package_name")

此命令将为您留下包名称。

编辑:
另一种方法是在您的

package.json
中添加一个脚本,即
echo $npm_package_name
,然后在 shell 命令中运行该脚本。

你的

package.json
看起来像这样:

{
  "name": "your_package_name",
  "scripts": {
      "getName": "echo $npm_package_name"
  }
}

然后输入

npm run getName -s


17
投票

如果您决定按照最初的想法使用

node
命令,您可以使用
-p
参数(它是
--print
的简写形式)使其变得更简洁:

node -p "require('./package.json').name"

或错误处理

node -p "try { require('./package.json').name } catch(e) {}"

3
投票

我也需要这个,但我尝试将节点排除在外,因为我永远不知道我将用来运行脚本的docker容器是否实际上安装了节点(这也是我不会使用jq的原因)。我通常使用这个shell脚本

npm run env | grep "npm_package_name" | awk -F "=" '{print $2}'

基本上它的作用是

  1. 获取 npm 包的环境
  2. grep 包含“npm_package_name”的行
  3. 拆分“=”并返回第二个条目

1
投票

如果您是 sed 爱好者:

npm run env | sed -n '/npm_package_name/{s/.*=//;p;}'

-n
开关禁止自动打印

为该行选择

/npm_package_name/
地址模式

{
启动命令块

s/.*=//;
通过等号将所有内容替换为空

p;
打印缓冲区

}
结束命令块


0
投票

npm cli 已经有一段时间了,这个 gem:

https://docs.npmjs.com/cli/v7/commands/npm-pkg

所以这意味着你可以这样做:


$ npm pkg get name

$ npm pkg set name "my-new-package-name"

想要更棒的东西:

pnpm --filter "pacakges/apps/*..." exec npm get name

将打印出

packages/apps
目录中所有包所使用的所有 monorepo 包的包名称。 过滤是大多数 monorepo 敏感包管理器的一项功能,例如 pnpm

© www.soinside.com 2019 - 2024. All rights reserved.