内网 Package 管理

目标 & 背景

一般来说,商业公司可能出于各种考量,会使用内网的开发环境,此时针对 DockerNuGetUMP 的服务全部都无法正常使用,同时公司也会自行维护一些自有的框架,也要解决包管理的问题

这篇文章希望通过介绍 SonaType Nexus[^1](下面简称为 Nexus) 的具体使用场景,补全一些网络上教程的空白,后面主要对 UMP 的使用场景进行介绍

从这些问题存在的角度上来看,这种属于商业公司基础建设的工具链,而相关的技术文章又很少

但是如果你们只需要解决 UMP 的内网问题,推荐用 Verdaccio[^2],并搭配 mob-sakai[^3] 大佬的仓库使用,这个解决方案最适合 Unity,Nexus 并不能完美兼容这个要自行取舍(也可能可以,但我们没找到方案)

准备工作

首先你需要一台机器可以同时访问内网和外网,其原理也很简单,同一台电脑插两根网线,一根连接内网,一根连接外网,最后用 Nginx 统一转发一下即可

实际公司的网络拓扑可能会比较复杂,但实现原理都是一样的

接着对客户端机器配置 host 文件,假设当前内外网机器的 内网 ip 为 10.0.0.123 外网 ip 为 10.0.100.123,然后根据客户端内外网情况配置一下即可,具体域名可以随意修改

内网外网
host10.0.0.123 npm.公司名.com10.0.100.123 npm.公司名.com

最后按照官方文档[^1] 的安装步骤,将 Nexus 安装好就可以开始了

Nexus 配置

我们需要准备两组 Repository,一组给公司自建的框架代码使用,一组给 Unity 官方包使用

  • unity-hosted 为自建代码
  • unity.com-proxy 为 Unity 官方包

请注意区分两个仓库的 Type 类型, 一个是 hosted 一个 是 proxy,最后我们在 unity.com-proxy 仓库中指定一下仓库源地址 https://packages.unity.com/

此处的 URL 就是项目中真实需要的地址

Unity 配置

Unity 的配置也很简单,我们希望接管所有 Unity 的 package 请求,那么在 Scopes 中就需要填写 com.unity

自建的仓库 unity-hosted 也是一样的道理,只是 Scopes 变成了 com.公司名

自建仓库具体使用

具体目录结构参考如下:

├── .git
├── .gitignore
├── Assets
│   ├── .gitignore
│   ├── .npmrc
│   ├── Runtime
│   ├── Runtime.meta
│   ├── package.json
│   └── package.json.meta
│ ...

由于 Unity 自建的 package 比较特殊,开发 package 的 git 仓库需要包含 AssetsPackages 等文件夹,但是 npm 发布的,仅需要包含指定文件夹,如当前示例中的 Assets 文件夹

所以我们需要按照这种方式进行构建,注意这里有两份 .gitignore 文件,一份是给 package git 仓库忽略用的,另一个 Assets/.gitingore 文件是给 npm publish 时忽略用的

这里使用 Assets/.npmignore 也可以

Assets/.npmrcAssets/package.json 就是 npm 包管理中最重要的文件了

package.json

我们可以使用下发代码创建 package.json 文件,按照交互式命令行填写即可

npm init

最后按照 Unity[^4] 的包管理标准增加或修改部分内容,这里便不做介绍了,随便找一份官方的 package.json 参考就行

.npmrc

具体结构如下,这里的 _auth 是给 Nexus 鉴权使用的,需要自己根据规则生成 base64 的编码格式

# 生成 base64 编码
echo -n '账号:密码' | openssl base64
cat .npmrc
# 最终配置
registry=https://xxx/repository/unity-hosted/
always-auth=true
_auth=base64账号密码

发布

按照上方过程配置好后,发布过程非常简单,一行命令就可以搞定了

npm publish

如果需要修改版本,我们可以通过 npm 已经提供好的命令直接修改 package.json 中的 version,更具体的建议阅读官方文档[^5]

# 现在是 1.0.0
npm version patch
# 现在是 1.0.1
npm version minor
# 现在是 1.1.0
npm version major
# 现在是 2.0.0

参考

[^1]: SonaType Nexus: https://help.sonatype.com/repomanager3/installation-and-upgrades/installation-methods

[^2]: Verdaccio: https://verdaccio.org

[^3]: mob-sakai: https://github.com/mob-sakai/unity.package-manager.metadata

[^4]: Unity Custom Package: https://docs.unity3d.com/Manual/CustomPackages.html

[^5]: npm 文档: https://docs.npmjs.com