搭建、使用与维护私有PyPi仓库
搭建PyPi仓库
安装依赖包
pypiserver
要搭建PyPi仓库,我们需要使用 pypiserver
库,这是一个最基本的 PyPI 服务器实现库,可以启动一个用来上传和维护Python包的服务器。
通过 pip install pypiserver 命令安装 pypiserver
库,该库在 Python 2x 或者 Python 3x 下均运行。
passlib
默认情况下,Python包的上传操作是无权限管理的,当我们希望使用密码来控制,只有指定用户才可以进行Python包的上传操作的时候,就需要使用 Apache htpasswd 文件,所以,我们需要 passlib
包来读取 Apache htpasswd 文件
通过 pip install passlib 命令安装 passlib
库,该库在 Python 2x 或者 Python 3x 下均运行。
那么 Apache htpasswd 文件是怎么生成的呢?我们需要安装 apache2-utils
工具包,以 Ubuntu 系统为例,使用下面命令安装:
$ sudo apt-get install -y apache2-utils
接下来,我们先使用 htpasswd
命令来生成一个 Apache htpasswd 文件:
$ pwd
/home/hekaiyou
$ ls -a
.
$ htpasswd -c /home/hekaiyou/.pypipasswd sam
New password: [输入密码]
Re-type new password: [再次输入密码]
Adding password for user sam
这样一个名为 sam 的用户就创建成功了,接下来我们在已有的 Apache htpasswd 文件中添加新的用户名及密码:
$ htpasswd /home/hekaiyou/.pypipasswd newuser
New password: [输入密码]
Re-type new password: [输入密码]
Adding password for user newuser
这样一个名为 newuser 的新用户也创建好了。
启动PyPI服务器
无认证方式启动
启动PyPI服务器之前需要在启动目录创建一个 packages 目录 (mkdir packages
),这个目录是用来Python包的,然后就可以启动PyPI服务器:
$ pypi-server -P . -a .
因为默认情况下,上传Python是需要密码的,不管我们可以通过上面的方式关闭密码保护, -P
参数指定密码,-a
参数指定需要密码保护的操作,我们把它们同时指定为 .
,表示所有的操作都不需要认证。
启动PyPI服务器,可以通过浏览器访问 http://localhost:8080/ 以打开PyPI服务器的默认欢迎页。
在没有显式指定启动参数的时候,pypiserver
库会使用 ~/packages 来保存Python包,同时监听 8080 端口来启动PyPI服务器。
认证方式启动
如果要控制用户上传Python包的操作,我们需要密码验证,在启动PyPI服务器时,通过 -P
参数来指定前面创建的 Apache htpasswd 文件。这样,用户上传Python库到私有仓库时,就会要求用户提供账户与密码。
接下来我们就可以用认证方式启动PyPI服务器了:
$ pypi-server -P /home/hekaiyou/.pypipasswd
监听端口与请求转发
通过 -p
参数可以指定PyPI服务器的端口,例如:
$ pypi-server -p 8090
私有PyPI服务器不可能包含社区所有的Python库,因此,当请求的Python包在本地上没有找到时,我们可以将请求转发到 外部PyPI源,以 阿里PyPI源 为例:
$ pypi-server --fallback-url https://mirrors.aliyun.com/pypi/simple/
这样就可以降低我们的维护成本,着重维护我们的私有内容,而不用作成一个镜像站点。
使用PyPi仓库
通过上一步,我们启动了私有PyPI服务器以后,我们可以将制作好的Python包上传到此目录下。
制作Python包
比如,我们有一个Python项目叫 hello_pypi
,项目根目录下有一个 setup.py 文件,内容如下:
import setuptools
import os# 读取根目录下的 README.md 文件内容,作为项目包的详细介绍
CUR_DIR = os.path.abspath(os.path.dirname(__file__))
README = os.path.join(CUR_DIR, 'README.md')
with open('README.md', "r") as fd:long_description = fd.read()# 包含 "Required" 标识的参数为必填参数,缺少将无法上传到PyPI
# 包含 "Optional" 标识的参数为可选参数,可以被注释掉setuptools.setup(# 这是当前项目的名称,首次发布此包时,这个名称将作为注册名称# 用户将通过这个名称来安装此项目包,例如:## $ pip install sampleproject## 项目名称的命名规范请查阅:# https://packaging.python.org/specifications/core-metadata/#name# Requiredname='hello_pypi',# 项目版本格式应符合 PEP 440 规范:# https://www.python.org/dev/peps/pep-0440/# Requiredversion='1.2a1',# 用一行文本介绍当前项目包的主要功能或作用# Optionaldescription='A simple hello pypi code',# 当前项目包的具体描述,这是用户在访问PyPI时将看到的详细介绍# Optionallong_description=long_description,# 与上述的具体描述对应的内容格式,有效值包含:# text/plain, text/x-rst, and text/markdown# Optionallong_description_content_type='text/markdown',# 指向当前项目的代码仓库或主页的有效链接# Optionalurl="https://github.com/hexiaoyou/hello_pypi",# 当前项目包的作者或组织的名称# Optionalauthor="Kaiyou He",# 与上述作者或组织对应的邮件地址# Optionalauthor_email="hky0313@outlook.com",# 如果项目包比较简单,那么可以在此处手动指定软件包目录# 或者直接使用默认的 find_packages(),它会递归查找包的文件## 另外,如果项目包中只有一个Python文件,请按下面的方式使用 `py_modules` 参数# 这样会存在一个名为 `my_module` 的文件:## py_modules=["my_module"],## Requiredpackages=setuptools.find_packages(),# 这里列出了当前项目包运行时依赖的其他项目包/库# 安装项目包时,放置在此处的所有软件包/库都将通过 pip 同时安装# 因此,它们必须是有效的库,否则将导致 pip 命令失败# Optionalinstall_requires=['colorama>=0.4.1','PrettyTable'],# 当前的项目包的关键字,这些关键字将显示在项目页面上,告知用户,这个项目与什么有关?# 请注意,这是一串用空格隔开的单词,而不是列表 keywords='demo pypi hello',
)
对应的根目录下还需要创建一个 README.md 文件,内容可以随便写。在打包之前我们可以验证 setup.py
文件的正确性:
$ python setup.py check
接下来我们需要进行打包操作,在项目根目录下执行:
$ python setup.py sdist
就这样,我们打好了一个空项目包。
上传Python包
无认证方式上传
上传命令与打包指令很像,就是后面加上 upload
参数,并用 -r
参数设置PyPI服务器地址:
$ python setup.py sdist upload -r http://localhost:8080
这样我们就可以通过 http://localhost:8080/simple/ 查看到我们刚才上传到项目包/库。
认证方式上传
认证方式上传的话,我们需要用到 twine
库,通过 pip install twine 命令安装 twine
库。
然后,在再次上传之前,我们需要改一下版本号,否则会报以下异常,即版本冲突的意思:
HTTPError: 409 Conflict from http://localhost:8080/
Conflict
我们可以在目录下添加一个 hello_pypi.py 文件,在里面设备写一个输出方法。
def demo():print('Hello PyPI')
然后在 setup.py 文件中修改版本为 version='1.2a2'
。然后再通过以下命令进行验证打包:
$ python setup.py check # 先验证
$ python setup.py sdist # 再打包
这时,你会发现 dist 目录下出现了两个版本,这里存放的就是我们打出来的Python项目包/库。
因为有多个Python项目包/库,因此我们在上传时,要选择具体的 dist/hello_pypi-1.2a2.tar.gz
打包文件。
$ twine upload dist/hello_pypi-1.2a2.tar.gz --repository-url http://localhost:8080
下载使用Python包
就像从其他源下载第三方库一样,我们只要通过 -i
参数,就可以指定到我们自己的PyPI服务器。下载命令如下:
pip install hello_pypi -i http://localhost:8080
接下来就可以调用我们自己的Python包/库了:
>>> import hello_pypi
>>> hello_pypi.demo()
Hello PyPI
>>>
搭建、使用与维护私有PyPi仓库相关推荐
- 搭建Docker本地私有镜像仓库
在使用Docker service create创建容器时,Docker首先默认从Docker Hub官方去下载镜像,这很不方便,很多时候我们的镜像都是使用Dockerfile自定义私有镜像,不对外公 ...
- Python 进阶 — 创建本地 PyPI 仓库与 Python 程序的离线部署
目录 文章目录 目录 创建本地 PyPI 仓库 安装 pypiserver 上传 Python 安装包 使用私有 PyPI 仓库 Python 程序的离线部署 pip download 获取必须的 P ...
- 【Docker】registry部署docker私有镜像仓库
Docker Hub作为Docker默认官方公共镜像仓库,但是如果我们不想使用怎么办,第一我们可以替换默认镜像仓库为我们国内的一些镜像仓库,第二就是如我们自己搭建一个自己的私有镜像仓库,官方也提供do ...
- python 内网镜像站_搭建私有YUM仓库与内网镜像站
原标题:搭建私有YUM仓库与内网镜像站 搭建私有YUM仓库 私有yum仓库环境 系统版本:centos7.4 IP:192.168.1.47 #最好能上公网 私有yum仓库服务端配置 第一:创建使用y ...
- 搭建私有helm仓库及图形界面
搭建私有helm仓库及图形界面 本篇主要介绍私有 helm 仓库 Chartmuseum 及图形界面 Monocular UI /kubeapps 的搭建 helm chart 能够很好的封装和管理我 ...
- Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)
# 使用docker-compose.yml 安装gitlab服务器 $ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/ ...
- android 加载系统私有库,Android 搭建私有maven仓库及上传项目
前言 在日常工作及项目迭代过程中,一定有不少同学自己写了一些框架性的东西,或者一些好用的工具,总之就是能复用的代码.然而也有不少同学为了复用这些代码不得不复制粘贴到不同项目中,这样相同的功能出现了多份 ...
- 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-29上传组件
亲历的企业级微服务的完整构建过程-系列文章目录 本人参与了这次的企业级微服务的完整构建,想要记录下来以便以后复习,同时也想分享给小伙伴们,抛砖引玉,欢迎大家提出自己的意见和建议,大家一起探讨一起成长. ...
- Python搭建私有pypi源发包——pypi-server
文章目录 简介 1. 搭建私有 pypi 源 2. 开发要上传的包 3. 生成 dist 目录用于上传 4. 上传包到私有 pypi 源 5. 安装 Linux 安装 参考文献 简介 本地搭建 pyp ...
最新文章
- cap mysql_.NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
- python连接服务器怎么用_使用Python连接到远程服务器
- 2020-2-15技术积累-时间插件-前端获取后端数据生成表格
- MySQL学习【第五篇SQL语句上】
- Python“三大器”之装饰器1
- Torchtext 教程
- eclipse导入jar包的三种方法
- Mysql之运算的使用
- c语言 队列长度,c语言 队列
- 东进的语音卡编程:最简单的电话外呼程序
- ps切图教程 android,PS前端切图完整教程
- 阿里-蚂蚁金服-一面电面-上海-java研发实习生
- 短视频不为人知的素材来源 以及平台推荐的黑盒机制
- 我的世界Linux服务端op,服务器,后台,单机,op必备指令大全
- [HDU](6333)Problem B. Harvest of Apples ---- 数论+莫队算法
- mysql主备同步错误:Last_Error: Could not execute Update_rows event; Error_code: 1032;
- 您的企业适合导入APS系统吗?跟着小编来了解一下吧(上)
- Jetson Xaiver NX相关教程(详细版)
- mysql的学生选课表_50个常用sql语句 网上流行的学生选课表的例子
- 《机器学习实战》第3章—隐形眼镜类型(Jupyter版决策树)