---
title: "cnpm 与 npm registry 管理"
date: 2021-08-19T00:12:20.000Z
author: Z.SHINCHVEN
tags: [cnpm, npm registry, bash]
canonical: https://atlassc.net/2021/08/19/cnpm
---
>长途跋涉去西方取 package 总是路途艰难，淘宝技术部开发了 `cnpmjs.org` 和 `cnpm` 这两个项目来克服这些人为的困难。

## cnpmjs.org

[cnpmjs.org](https://github.com/cnpm/cnpmjs.org)是一个基于`nodejs`开发、供企业/团队使用的私有`npm registry`，它同时也可以中继缓存[npmjs.org](https://npmjs.org)的上的packge，让用户可以在困难的网域顺利地获取`npm package`。

它功能完善也易于部署和维护，但是由于一些原因，我并不想部署一个私有的`cnpmjs.org`：
- 中继`npmjs.org`时间长了以后，`cnpmjs.org`要占用掉几百GB甚至更多的磁盘空间来缓存`package`。
- 直接使用`淘宝`基于`cnpmjs.org`部署的[公共镜像](https://registry.nlark.com/)的的话，也能有很快的速度，我并不需要在局域网自己来做缓存。
- [Sonatype Nexus Package Manager](https://www.sonatype.com/products/repository-pro)比`cnpmjs.org`的功能更强大，并且囊括各种仓库于一体，我没有必要再部署一个单独的`npm registry`。

所以我直接在`npm`里使用[淘宝镜像](https://registry.nlark.com/)来加速：

```bash
npm config set registry https://registry.nlark.com
```


## cnpm

[cnpm](https://github.com/cnpm/cnpm)是`cnpmjs.org`的客户端，默认指向`淘宝镜像`，可视为`npm`或`yarn`的替代品，但它并不好用：
- `cnpm`有自己的`node_modules`目录结构，并且与`npm`不兼容。
- 使用`JetBrains`家族的IDE打开`cnpm`的项目，会遇到卡死的情况。

## 我自己的cnpm

为了便捷地切换`npm`全局的`registry`，我用`bash`搞了个我自己的`cnpm`来管理`npm`的全局`registry`设置：

1. 创建一个`bash`命令脚本

```bash
# 当然你可以给这个脚本起其它的名字。
$ sudo vim /usr/local/bin/cnpm
```

2. 写入bash脚本

```bash
#!/bin/bash

# 默认使用淘宝镜像
taobao_registry=https://registry.nlark.com
REG_URL=${1:-$taobao_registry}

# 如果传入参数是 unset，则清空已设置的 registry
if [ "$1" == "unset" ]
then
  echo 'unset npm registry from taobao'
  npm config delete registry
# 设置淘宝镜像或者指定的镜像
else
  echo 'set npm registry to taobao'
  npm config set registry $REG_URL
fi

# 检查 npm 配置
npm config list
```

3. 增加运行权限

```bash
sudo chmod +x /usr/local/bin/cnpm
```

4. 使用命令脚本

```bash
# 设置 npm 全局使用 淘宝镜像 registry 
$ cnpm
# 设置 npm 全局使用 其它镜像 registry
$ cnpm <REGISTRY_URL>
$ cnpm https://r.npm.taobao.org # 举例 
# 清除 npm 的全局 registry 设置
$ cnpm unset
# 不使用cnpm来设置npm registry
$ npm config set registry <REGISTRY_URL>
$ npm config set registry https://registry.nlark.com # 举例
```
