2

npm是一个非常好用的包管理工具,运用在非常多的项目里。当我们需要依赖包时,npm会从镜像中下载到本地(默认是 https://registry.npmjs.org/ ,国内应该有不少同学会将这个镜像改成淘宝的)。

但是当我们在内网环境开发时,没有外网,不能连接到公网镜像,此时我们就需要搭建一个内网的镜像,将需要的依赖放在这个镜像上。

这里我们使用Nexus3来创建私库。

准备一 创建Nexus3的仓库

  1. 首先创建一个仓库
    image.png
  2. 接下来选择npm(hosted),我们没有外网,所以不创建代理和分组
    image.png
  3. 然后填写一个名字就可以,其他的暂时可以不考虑,如果有同学创建了自己的Blob,则选为自己创建的Blob即可
    image.png

准备二 下载tgz包

  1. 首先,安装 node-tgz-downloader,用来下载依赖tgz文件(如果有npm-pack-all也可以,这里以node-tgz-downloader为例)

    npm install node-tgz-downloader -g
  2. 打开我们的node工程,将需要的依赖都安装到本地(如果已经安装,或已经生成package-lock.json文件,则跳到下一步),执行命令

    npm install

    这里特别注意,尽可能使用https://registry.npmjs.org/这个镜像,淘宝虽然快,但是出问题了真是不知道怎么解决。检查当前使用的镜像命令

    npm config get registry

    不知道怎么修改镜像地址的同学可以使用下面这个命令

    npm install --registry=https://registry.npmjs.org/

    或者在工程根目录下新建一个.npmrc文件,手动定义镜像地址
    image.png

  3. 生成 package-lock.json文件后,执行命令

    download-tgz package-lock package-lock.json

    这个命令会根据package-lock.json文件,下载所需要的依赖包tgz,如果存在下载失败的情况,则多执行几次命令,直到所有依赖都下载完成。

  4. 下载的tgz文件会在项目根目录/tarballs下,这个时候基本上就完成了tgz的下载。

准备三 发布tgz到nexus

  1. 为了跟下面的脚本保持一直,将所有tgz都放到一个目录下,新建tgz文件夹,并在tarballs文件夹下执行下面的shell命令,这里用shell脚本找出tarballs文件夹下所有tgz包并复制到tgz文件夹下(这里都放到一个目录下是因为当有多个工程时,依赖包可能会重复,发布时tgz有重复则会报错,所以是一个去重的操作)。

    find . -name '*.tgz' -exec cp -f {} ../tgz \;
  2. 创建发布脚本(单个工程时可利用find命令改动下面的脚本,省去第一步)

    #!/bin/bash
    
    PACKAGE_PATH=./tgz
    REPOSITORY=http://ip:port/repository/dataservice-web/
    
    npm login --registry=$REPOSITORY
    
    for file in $PACKAGE_PATH/*.tgz; do
     npm publish --registry=$REPOSITORY
    done
  3. 执行发布脚本,会要求填写username,password以及email,填写完就会开始发布;这个时候就非常慢了,耐心等待(我这里6百个tgz,用时大概十分钟)

结束

由于没找到使用Nexus3的API上传依赖的例子,所以使用了npm的发布命令,导致上传比较慢,并且对重复的依赖不能做自动处理。如果有知道的同学可以留言讲一下。

如果上传完之后,还存在个别包不存在的情况,那就可以通过手动上传的方式,利用Nexus3的界面上传即可。


虚惊一百场
19 声望7 粉丝

1 + 1 = 2