写点什么

终于完成了私有 NPM 和 PYPI repo 的搭建

用户头像
DisonTangor
关注
发布于: 2 小时前

由于服务器处在局域网环境,因此我们这儿的.net 高手之前搭了 ProGet, 而且当时的需求只是搭建一个简单的 nuget repo。而最近,我在用 Flask 开发一个前后端分离框架的项目。于是,我打算用 Nexus 3 OSS 搭一套更强的软件库管理系统。为此,我先前翻译一篇《在 CentOS 7上安装Sonatype Nexus Repository OSS》,感觉用处颇丰。唯一的区别是我采用了 apache 代替 nginx。其一,流量达不到负载压力;其二,CentOS 自带 Apache2。

Apache 配置

查看模块:


$ httpd -M
复制代码


显示如下:


. . .proxy_module (shared). . . lbmethod_byrequests_module (shared). . . proxy_balancer_module (shared). . . proxy_http_module (shared). . . 
复制代码


如果模块未启用,您可以通过打开/etc/httpd/conf.modules.d/00-proxy.conf来启动


$ vi /etc/httpd/conf.modules.d/00-proxy.conf
复制代码


并通过 #从行开头删除符号来取消注释带有必要模块的行,因此文件如下所示:


. . .LoadModule proxy_module modules/mod_proxy.so. . .LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so. . .LoadModule proxy_balancer_module modules/mod_proxy_balancer.so. . .LoadModule proxy_http_module modules/mod_proxy_http.so. . .
复制代码


要使更改生效,请保存文件并重新启动 Apache.


$ sudo systemctl restart httpd
复制代码


配置代理:将以下内容粘帖到/etc/httpd/conf.d/default.conf文件中:


<VirtualHost *:80>    ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/</VirtualHost>
复制代码

PyPI

  1. 访问 apache 的http://<apache IP>/, 并登录后构建 hosted 的 PyPI

  2. 下载 python 项目的依赖关系,可以参考文献2

  • 直接下载

$ pip download requestscertifi-2020.4.5.1-py2.py3-none-any.whlchardet-3.0.4-py2.py3-none-any.whlidna-2.9-py2.py3-none-any.whlrequests-2.23.0-py2.py3-none-any.whlurllib3-1.25.9-py2.py3-none-any.whl
复制代码
  • 只获取依赖

# Install pipdeptree:$ pip install pipdeptree $ pipdeptree -p requests requests==2.23.0- certifi [required: >=2017.4.17, installed: 2020.4.5.1]- chardet [required: >=3.0.2,<4, installed: 3.0.4]- idna [required: >=2.5,<3, installed: 2.9]- urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.9]
复制代码
  • 保存信息到 requirements.txt

certifi>=2017.4.17chardet>=3.0.2,<4idna>=2.5,<3urllib3>=1.21.1,<1.26,!=1.25.1,!=1.25.0
复制代码
  • 根据 requirements.txt 下载依赖包

(current directory) $ pip download -r requirements.txt
复制代码
  • 将 whl 文件上传到对应的 PyPI 库中。可以使用 twine 上传,也可以逐个在 Nexus 页面上传。

  • 安装包存在 trusted-host 的限制

$ pip install package -i http://<ip或域名>/repository/pypi-hosted/simple --trusted-host <ip或域名>
复制代码

NPM

  1. 访问 apache 的http://<apache IP>/, 并登录后构建 hosted 的 npm

  2. 参考文献4

1、下载 npm 包

  • 在项目目录下,创建一个文件夹用于存放离线 npm 包

yarn config set yarn-offline-mirror ./npm-packages-offline-cache
复制代码
  • 设置离线缓存模式,并在项目目录下生成一个.yarnrc 文件

yarn config set yarn-offline-mirror-pruning true
复制代码
  • 将.yarnrc 文件移到项目目录下

mv ~/.yarnrc ./
复制代码
  • 删除 yarn.lock 文件

rm -rf node_modules/ yarn.lock
复制代码
  • 安装 npm 包

yarn install
复制代码

2、批量上传

  • 配置 npm 仓库地址

npm config -g set registry 远程仓库地址
复制代码
  • 登录 hosted 仓库

npm adduser -registry=hosted类型npm仓库的地址
复制代码
  • 对于 nexus 设置 security–>Realms,添加“npm Bearer Token Realm”。注意这很重要。

  • 批量上传 bat 脚本

@echo off:: init paramsset deployFile=*.tar.gzset deployFile2=*.tgzset url=http://xxx.xxx.xx.xx/repository/npm-hosted/echo Searching tar.gz and tgz file...rem 启用"延缓环境变量扩充"SETLOCAL ENABLEDELAYEDEXPANSIONfor %%f in (%deployFile% %deployFile2%) do (set name=%%fecho !name! to deploy to %url%rem deploy to servercall npm publish -registry=%url% !name!)
pause
复制代码
  • 补充一下:如果用 Nginx 的可以不用看这段。Apache 有点坑,对 Url 的斜杠不智能。所以需要配置一下。非常感谢材料5的第二份回答:

root下# command -v httpd/usr/sbin/httpd# /usr/sbin/httpd -vServer version: Apache/2.4.6 (CentOS). . .# vim /etc/httpd/conf.d/default-site.conf #之前配置代理的文件
复制代码
  1. 修改一下


. . .AllowEncodedSlashes NoDecodeProxyPass / http://127.0.0.1:8081/ nocanon. . .
复制代码

结语

Sonatype Nexus Repository OSS 真的不错,开源版本都如此强大。目前 Maven、Nuget 和 Docker 的 repo,虽然我暂时没用起来,但是它对各种依赖包的支持已经很全面了。推荐有私人 NAS 的开发者也可以装一个试试。最后,非常感谢参考文献中作者们对 Nexus、PyPI 和 NPM 问题的解读与分享,希望我写的这篇也能受用于各位读者。

参考文献

  1. How To Use Apache as a Reverse Proxy with mod_proxy on CentOS 7

  2. How To Download Python Dependencies

  3. 使用 Nexus 搭建 PyPi 私服

  4. 深入浅出FE(十三)前端nexus3 Yarn离线部署npm仓库

  5. Nexus 3 as npm repository can't find some dependencies: npm ERR! 404 Not Found

发布于: 2 小时前阅读数: 2
用户头像

DisonTangor

关注

怀揣一个武侠梦的男孩 2020.07.29 加入

还未添加个人简介

评论

发布
暂无评论
终于完成了私有NPM和PYPI repo的搭建