nexus、lerna搭建npm私有仓库

3,314 阅读6分钟

1、nexus搭建托管平台

利用nexus搭建私有仓库托管平台,可以很方便地在nexus平台上创建自己私有的npm仓库 nexus官方文档: help.sonatype.com/repomanager…

下载nexus

因为官网的下载速度太慢了,这里我是直接在网上找了一个压缩包进行安装的。

百度云链接:pan.baidu.com/s/1GfGwM6JH… 提取码:f37p

运行nexus

将安装包解压后使用管理员模式打开命令行工具,进入/nexus-3.19.1-01/bin/nexus.exe路径下,运行: .\nexus.exe /run

这样,一个nexus平台就已经运行在默认端口8081上了,你可以使用浏览器访问127.0.0.1:8081,即可以打开本地nexus平台了

初始密码

第一次打开nexus平台需要输入nexus的默认账户与密码进行登录

初始用户名为admin

初始密码存放于/nexus-3.19.1-01-win64/sonatype-work/nexus3/admin.password文件中

// 查看密码后手动复制,即可用于登录
cat admin.password

登录成功后会让你设置新的密码,在后面我们会在nexus上创建私有的registry,这一组用户名密码同样是我们访问平台上的私有registry的凭证。

后续我们向私有registry发布私有包的时候,就需要用到这里的用户名密码,

2、创建私有托管仓库

按照以下步骤新建npm私有仓库 这部分操作比较简单,就直接上截图啦

在选择仓库类型的时候,直接选择npm(hosted):

3、初始化一个lerna工程

创建一个lerna项目

// 新建项目目录
mkdir lerna-repo && cd _$
// 在新建的目录下,初始化lerna项目
lerna init --independent

注:--independent 参数表示项目中的所有包之间的版本独立,在发布时只会发布存在改动的包,而不会将其他没有改动的包以同一个版本号统一发布。

上述命令执行成功后你的新项目目录会是以下结构

+ packages(目录)
lerna.json(配置文件)
package.json(工程描述文件)

添加一个package

lerna create package-1 // package-1是新建的package的目录名

执行成功, 后你的新项目目录会是以下结构

- my-lerna-repo/
    package.json
    - packages/
        - package-1/
          package.json 

设置项目发布的registry

修改项目的lerna.json:

这里主要目的是修改command.publish.registry配置,将其设置为我们刚才使用nexus新建的npm私有仓库地址,指定发布到的npm registry为我们的私有仓库.

如果不配置的话,会默认发布到npm的官方registry。

仓库地址可以在nexus平台上查看,在仓库列表中点击对应仓库的copy按钮就可以复制对应地址了:

修改后的lerna.json内容如下:

{
  "packages": [
    "packages/*"
  ],
  "version": "independent",
  "npmClient": "yarn",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish",
      "registry": "http://127.0.0.1:8081/repository/local-npm"
    },
    "bootstrap": {
      "npmClientArgs": ["--no-package-lock"]
    }
  }
}

将项目上传到git远程仓库

修改package中的name配置项,如lerna-repo

这样我们刚刚创建的package-1就可以以@lerna-repo/package-1这样的依赖名在别的项目中去安装了:

{
  "name": "lerna-repo",
  "version": "0.0.1",
  "devDependencies": {
    "lerna": "^3.22.1"
  }
}

lerna是通过git来进行代码管理的,所以项目必须要上传到git仓库

4、给lerna项目配置私有仓库访问权限

方法一: 使用领域身份验证进行身份验证(sonatype文档): 运行以下命令,出现提示时,需要提供您的存储库管理员用户名和密码以及电子邮件地址。成功完成后,会将这一组合进行身份验证的内容自动添加到全局.npmrc特定存储库的配置文件中。

npm adduser --registry=http://localhost:8081/repository/npm-internal/

方法二: 使用基本身份验证进行身份验证(sonatype文档):

在某些情况下,您不能使用领域和登录方法,例如,如果您的用户名包含大写字母(被禁止npm login)。在这些方法中,您仍可以通过将npm配置为与存储库管理器一起使用基本身份验证来使用它。这种身份验证方法包括编辑.npmrc配置文件,添加编码的用户名和密码以及将身份验证配置为始终验证。

// 生成base64编码的'username:password'字符串
echo -n 'admin:admin123' | openssl base64

将生成后base64复制到当前仓库的.npmrc中的_auth=内容后,即可访问私有仓库

修改后的.npmrc文件内容如下:

_auth=YWRtaW46MTIzNDU2
always-auth=true

5、利用lerna发布私有包到nexus搭建的私有仓库

在发布前所有的改动都必须提交git commit

准备就绪后,在项目根目录下运行:

lerna publish

这样,你的项目就成功发布到你的私有仓库中了

6、如何安装发布到私有仓库的包

首先我们还是要有私有仓库的访问凭证,同样可以使用我们上述的两种配置私有仓库访问权限的方法,npm adduser或者直接修改需要安装私有包的项目的.npmrc文件,这里我直接用第二种方法,在项目的.npmrc文件中添加一下内容:

registry="http://127.0.0.1:8081/repository/local-npm/"
_auth=YWRtaW46MTIzNDU2
always-auth=true

这里的registry还是我们私有仓库的仓库地址,用来指定我们安装依赖的来源

_auth同样是根据用户名密码生成的base64字符串,不懂的同学可以回头参考上面的第四点的内容。

这样我们的项目就拥有了访问我们私有仓库的权限

还记不记得我们刚才在lerna工程中新建了一个package叫做package-1,那我们就可以来安装一下它:

yarn add @lerna-repo/package-1

这样一个私有包就被安装到你的项目中了

发布公共包到npm官方仓库

以上是介绍了如何发布package到自己或者公司的私有仓库,但平时我们在项目中直接运行npm install所安装的依赖,大多是一些开源的package,那么我们自己也可以上传自己的package到官方的npm上,开源给其他人使用.

接下来就介绍如何发布package到官方npm registry上

注册npm账号:

首先需要有一个npm账号 打开官网进行注册https://www.npmjs.com/,注册后你将收到一封邮件,你需要打开邮件进行确认后,才能够使用当前账号发布包

本地添加npm账户 运行下面的代码,在本地给npm官方registry添加账户,后续发包将使用该账户的身份信息进行校验

在运行后将需要填写你在npm官网的用户名、密码与邮箱

npm adduser --registry=https://reg istry.npmjs.org/

成功完成后,这一组合进行身份验证的内容会被自动添加到全局.npmrc配置文件中,供发布时校验身份使用。

发布代码

在package中添加version、name信息

注:name不可与npm 现有的包重名,所以这里我把name字段修改为repo20200716

如果需要npm在执行publish之前自动执行一些命令的话,可以给package.json的scripts项添加prepublish命令,如在publish之前自动运行build命令:

{ "name": "repo20200716", "version": "0.0.1", "scripts": { "build": "cross-env NODE_ENV=production webpack", "prepublish": "npm run build" }, "devDependencies": { "lerna": "^3.22.1" } }

最后运行:

npm publish

发布完成后,可以到npm官网上搜索你发布的包,可以看见,我刚刚发布的名为repo20200716已经可以搜索到了:

至此,你的包就已经成功发布到npm官方仓库上了.