如果我们想使用S3来托管Python包,我们如何告诉pip在哪里可以找到最新的版本?

F Z*_*Zhu 9 python pip amazon-s3

我们正在努力想出一个让AWS S3托管和分发我们的Python软件包的解决方案.

基本上我们想要做的是使用"python3 setup.py bdist_wheel"来创建一个轮子.将其上传到S3.然后任何服务器或任何机器都可以执行"pip install $ http:// path/on/s3 ".(包括AWS lambda中的virtualenv)(我们调查了Pypicloud并认为这是一种过度杀伤力.)

从S3创建包和安装工作正常.这里只有一个问题:我们将发布新代码并为它们提供不同的版本.如果我们在Pypi上托管我们的代码,您可以通过调用"pip install package --upgrade"将一些软件包升级到最新版本.

但是如果你在S3上托管你的软件包,你怎么让pip知道有更新的版本存在?如何通过简单地给pip版本号回滚到旧版本?有没有办法让pip知道S3在哪里寻找不同版本的车轮?

Shi*_*iva 14

AWS S3 可以用作 pypi 服务器,配置最少,没有其他附加依赖项。

假设您想使用存储桶mypackages来托管您的私有包 -awesomepyrattlesnake.

在 S3 中创建存储桶后,转到其属性,单击静态网站托管卡并启用选项Use this bucket to host a website。记下单选按钮上面提到的端点

以下是您必须如何安排文件夹和文件:

mypackages
    |
    |---awesomepy
    |       |---awesomepy-1.10.0-py27-none-any.whl 
    |       |---awesomepy-1.10.3-py27-none-any.whl 
    |       |---index.html
    |
    |---rattlepy
            |---rattlesnake-0.1.1-py27-none-any.whl 
            |---index.html

Run Code Online (Sandbox Code Playgroud)

index.html包中的文件夹,文件将具有类似下面的内容

<html>
<head>
    <title>Links</title>
</head>
<body>
    <h1>Links</h1>
    <a href='awesomepy-1.10.0-py27-none-any.whl'>awesomepy-1.10.0-py27-none-any.whl </a>
    <br />
    <a href='awesomepy-1.10.3-py27-none-any.whl'>awesomepy-1.10.3-py27-none-any.whl </a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Wheel 包必须遵循正确的命名规则。有关详细信息,请参阅PEP 427。对于虚拟包 - awesomepy-1.10.3-py27-none-any.whl,我们假设,

  1. 语言实现是 Python 2.7 - py27
  2. ABI 标签是无 - none
  3. 平台是任何 - any

最后,您可以使用以下命令安装软件包。确保您的包的名称与 pypi 包的名称不同。用您的公司首字母前缀包名称是一种简单的解决方案。

pip install awesomepy rattlesnake==0.1.1 --extra-index-url=<s3 Endpoint> --trusted-host=<s3 Endpoint without http>
Run Code Online (Sandbox Code Playgroud)

使用pip install awesomepy --upgrade这种方法升级包也适用。

此外,修改您的存储桶权限以将包限制为目标客户。一种方法是:在存储桶中
选择权限选项卡 --> 编辑存储桶策略

原始信用:我的前经理 Adlon :)

  • 我的回答中没有提到“setup.py”。 (2认同)

Ber*_*pac 3

无耻插件:我遇到了完全相同的问题,并且对任何现有的解决方案都不满意,所以我写了一个小的 Lmabda/Terraform 组合来解决这个问题:https: //github.com/berislavlopac/plambdapi

希望能帮助到你!