Say Goodbye to Package Manager Chaos with ni
Tags: webdev, programming, npm, yarn
Published: 2023-02-23 15:07:39

Have you ever found yourself working on multiple projects that use different package managers and accidentally run the wrong one in the wrong project? 

This can create a mess of conflicting lock files and dependencies, causing wasted time. Fortunately, there is a solution to this problem: [`ni`](https://github.com/antfu/ni).

`ni` is an uncomplicated yet powerful tool that lets you run the right package manager for any project without having to remember which one it uses. This blog post explains how to use `ni` and its various commands.

## Installing NI

To install `ni`, run the following command in your terminal:

```bash
npm i -g @antfu/ni
```

The `-g` flag installs it globally so you can use it across all of your projects.

## Using NI

`ni` has several commands that make it easier to use the correct package manager in your project. Below, we cover the list of most common commands in detail.

### `ni` to install packages

The `ni` command installs packages using the correct package manager for your project. To use it, just run the command followed by the package name.

```bash
# Install React, automatically using the correct package manager
# Does `npm install react` for npm, `yarn install react` for yarn, etc
ni react
```

This command installs React using the correct package manager (`npm`, `yarn`, `pnpm`, or `bun`).

Use `-D` for dev dependencies:

```bash
# For dev depencencies
ni @types/react -D
```

Use `--frozen` to avoid writing to lockfiles:

```bash
# Equivalent to npm ci, yarn install --immutable, etc
ni --frozen
```

### `nr`  to run scripts

The `nr` command runs scripts in your project using the correct package manager. To use it, run the command followed by the script name and any options.

```bash
# Run `npm start` in npm, `yarn start` for yarn, etc
nr start
```

This command runs the start script using the correct package manager.

This also has one handy benefit — you do not need `--` to separate args for your script:

```bash
# Equivalent of `npm run serve -- --port 8080`, `yarn run serve --port 8080`, etc
nr serve --port 8080
```

You can also just run `nr` to interactively choose which script to run:

{% youtube https://youtu.be/TzZ2l_GHiLw %}

### `nix` to execute packages

The nix command executes packages using the correct package manager for your project. To use it, run the command followed by the package name.

```bash
# Equivalent to `npx jest` in npm, `yarn dlx jest` in yarn, etc
nix jest
```

This command executes Jest using the correct package manager.

### `nu` to upgrade packages

The `nu` command updates outdated packages using the correct package manager for your project. To use it, run the command followed by any options.

```bash
# Equivalent to `npm upgrade`, `yarn up`, etc
nu
```

This command updates all packages to their latest versions using the correct package manager.

### `nun` to uninstall packages

The `nun` command uninstalls packages using the correct package manager for your project. To use it, run the command followed by the package name.

```bash
# Equivalent to `npm uninstall react`, `yarn remove react`, etc
nun react
```

This command uninstall React using the correct package manager.

### Change directory with `-C`

You can also use `ni` to change a directory and run commands in the new directory.

```bash
ni -C packages/foo react
```

This command changes the directory to `packages/foo` and install React using the correct package manager.

## Conclusion

By using [ni](https://github.com/antfu/ni), you can save yourself a lot of time and avoid the frustration of dealing with conflicting lock files and dependencies. So if you haven't already, give `ni` a try — you won't regret it!