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

1,085 阅读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 requests
        certifi-2020.4.5.1-py2.py3-none-any.whl
        chardet-3.0.4-py2.py3-none-any.whl
        idna-2.9-py2.py3-none-any.whl
        requests-2.23.0-py2.py3-none-any.whl
        urllib3-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.17
        chardet>=3.0.2,<4
        idna>=2.5,<3
        urllib3>=1.21.1,<1.26,!=1.25.1,!=1.25.0
      

      根据requirements.txt下载依赖包

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

  4. 安装包存在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

    • 下载npm包

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

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

         yarn config set yarn-offline-mirror-pruning true
        
      3. 将.yarnrc文件移到项目目录下

         mv ~/.yarnrc ./
        
      4. 删除yarn.lock文件

         rm -rf node_modules/ yarn.lock
        
      5. 安装npm包

         yarn install
        
    • 批量上传

      1. 配置npm仓库地址

         npm config -g set registry 远程仓库地址
        
      2. 登录hosted仓库

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

      4. 批量上传bat脚本

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

     root下
     # command -v httpd
     /usr/sbin/httpd
     # /usr/sbin/httpd -v
     Server version: Apache/2.4.6 (CentOS)
     . . .
     # vim /etc/httpd/conf.d/default-site.conf #之前配置代理的文件
    

    修改一下

     . . .
     AllowEncodedSlashes NoDecode
     ProxyPass / 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