Skip to content

ni 完全指南

ni 是由 Anthony Fu 开发的命令行工具,能够自动检测项目使用的包管理器(npm/yarn/pnpm/bun),并使用对应的命令执行操作。在多项目、多包管理器环境下,不再需要记忆各种命令差异。

🎯 环境说明:本文基于 @antfu/ni v0.23.x 编写。

为什么需要 ni#

🙋 不同项目可能使用不同的包管理器。每次切换项目都要想一下:

✅ ni 解决了这个问题。只需记住一套命令,ni 会根据 lockfile 自动识别包管理器并调用对应命令。

Terminal window
# 无论项目用的是 npm/yarn/pnpm/bun
$ ni # 安装依赖
$ nr dev # 运行脚本
$ nu # 更新依赖

安装#

Terminal window
$ npm install -g @antfu/ni
# 或
$ pnpm add -g @antfu/ni
# 或
$ yarn global add @antfu/ni

验证安装:

Terminal window
$ ni --version
0.23.0

核心命令#

ni 提供了一组简短的命令,对应不同包管理器的常用操作:

ni 命令npmyarnpnpmbundeno
ninpm installyarn installpnpm installbun installdeno install
ni pkgnpm i pkgyarn add pkgpnpm add pkgbun add pkgdeno add pkg
nrnpm runyarn runpnpm runbun rundeno task
nunpm updateyarn upgradepnpm updatebun updatedeno upgrade
nupnpm upgradeyarn uppnpm updatebun updatedeno upgrade
nunnpm uninstallyarn removepnpm removebun removedeno remove
ncinpm ciyarn --frozenpnpm --frozenbun --frozendeno cache
nlxnpxyarn dlxpnpm dlxbunxdeno run npm:
nanpmyarnpnpmbundeno

ni - 安装依赖#

Terminal window
# 安装 package.json 中的所有依赖
$ ni
# 安装指定包(生产依赖)
$ ni lodash
# 安装开发依赖
$ ni -D typescript
# 安装多个包
$ ni express cors helmet
# 冻结安装(CI 环境)
$ ni --frozen

ni 会根据项目中的 lockfile 检测包管理器:

Lockfile包管理器
package-lock.jsonnpm
yarn.lockyarn
pnpm-lock.yamlpnpm
bun.lockbbun

nr - 运行脚本#

Terminal window
# 运行 dev 脚本
$ nr dev
# 运行带参数的脚本
$ nr test --watch
# 交互式选择脚本
$ nr
# 运行指定脚本,如果不存在则忽略
$ nr build --if-present

不带参数执行 nr 会列出所有可用脚本供选择:

Terminal window
$ nr
? script › - Use arrow-keys. Return to submit.
dev
build
test
lint

nr 的便捷之处#

无论项目用什么包管理器:

Terminal window
# 不用区分 npm run dev / yarn dev / pnpm dev
$ nr dev

nu - 更新依赖#

Terminal window
# 交互式更新
$ nu
# 更新指定包
$ nu lodash
# 更新所有包
$ nu -i

nup - 升级依赖#

Terminal window
# 升级依赖
$ nup
# 交互式升级(不支持 npm/bun/deno)
$ nup -i

nci - 清洁安装#

用于 CI 环境,基于 lockfile 安装精确版本:

Terminal window
$ nci
# npm ci
# yarn install --frozen-lockfile
# pnpm install --frozen-lockfile
# bun install --frozen-lockfile
# deno cache --reload

nun - 卸载包#

Terminal window
# 卸载包
$ nun lodash
# 卸载多个包
$ nun lodash express

nlx - 执行包命令#

Terminal window
# 类似 npx,临时下载并执行
$ nlx create-react-app my-app
# 执行本地包命令
$ nlx eslint src

na - 直接调用包管理器#

当需要执行 ni 没有封装的命令时,使用 na:

Terminal window
# 等同于 npm/yarn/pnpm/bun 的原生命令
$ na cache clean
$ na audit
$ na outdated

全局标志#

ni 支持一些全局标志:

Terminal window
# 打印将要执行的命令(不执行)
$ ni vite ?
# 切换到指定目录执行
$ ni -C packages/foo vite
$ nr -C playground dev
# 显示版本
$ ni -v
# 显示帮助
$ ni -h

全局安装#

Terminal window
# 全局安装包
$ ni -g typescript
# 全局卸载
$ nun -g typescript

检测机制#

ni 按以下顺序检测包管理器:

  1. 检查当前目录及父目录的 lockfile
  2. 检查 package.json 中的 packageManager 字段
  3. 如果都没有,提示选择

使用 packageManager 字段#

package.json 中指定包管理器(Corepack 规范):

{
"packageManager": "pnpm@9.15.0"
}

ni 会识别并使用指定的包管理器。

配置#

在用户目录创建 ~/.nirc 配置文件:

; 默认使用的包管理器(无 lockfile 时)
defaultAgent=pnpm
; 全局包使用的管理器
globalAgent=npm

配置选项#

选项说明默认值
defaultAgent默认包管理器提示选择
globalAgent全局安装使用的包管理器npm

实用场景#

多项目开发#

假设你同时维护多个项目:

有了 ni,无需切换思维:

Terminal window
$ cd project-a && ni && nr dev
$ cd project-b && ni && nr dev
$ cd project-c && ni && nr dev

CI/CD 环境#

在 CI 中使用 --frozen 确保依赖版本一致:

# GitHub Actions 示例
- name: Install dependencies
run: npx @antfu/ni --frozen
- name: Build
run: npx @antfu/ni run build

脚本中使用#

在 npm scripts 中也可以使用 ni:

{
"scripts": {
"setup": "ni",
"dev": "nr dev"
}
}

项目模板#

创建项目模板时,使用 ni 命令可以让模板适配任何包管理器:

setup.sh
#!/bin/bash
ni
nr build

与其他工具对比#

工具特点
ni自动检测,统一命令
npxnpm 专属,执行包命令
pnpxpnpm 专属
yarn dlxyarn 专属
bunxbun 专属

ni 的优势在于跨包管理器的统一体验。

常用命令速查#

命令用途
ni安装所有依赖
ni <pkg>安装包
ni -D <pkg>安装开发依赖
ni -g <pkg>全局安装
ni --frozen冻结安装(CI)
ni -i交互式搜索安装
nci清洁安装(CI 推荐)
nr交互式运行脚本
nr <script>运行指定脚本
nu更新依赖
nu <pkg>更新指定包
nup升级依赖
nup -i交互式升级
nun <pkg>卸载包
nun -m交互式多选卸载
nlx <pkg>执行包命令
na <cmd>调用原生包管理器命令
ni -C <dir>切换目录后执行

常见问题#

检测到错误的包管理器#

删除不需要的 lockfile,或在 package.json 中明确指定:

{
"packageManager": "pnpm@9.15.0"
}

想要强制使用某个包管理器#

使用环境变量:

Terminal window
$ NI_DEFAULT_AGENT=pnpm ni

或在 ~/.nirc 中设置 defaultAgent

Windows 兼容性#

ni 完全支持 Windows,包括 PowerShell 和 CMD。

参考资料#