【问题标题】:If we want use S3 to host Python packages, how can we tell pip where to find the newest version?如果我们想使用 S3 来托管 Python 包,我们如何告诉 pip 在哪里可以找到最新版本?
【发布时间】:2016-07-01 13:50:30
【问题描述】:

我们正在尝试提出一种解决方案,让 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 上不同版本的轮子?

【问题讨论】:

  • 您需要查看 Python 打包用户指南中的 Hosting your Own Simple Repository 文档和 pip's --index-url / --extra-index-url 参数。
  • 如果您不必弄清楚这些东西,真的是大材小用吗?不使用别人已经构建的软件来做你想做的事,你真正获得了什么?少一台服务器或服务来管理?除非您目前没有服务器并希望保持这种状态(这听起来不切实际)或者您的包上传/下载将是一个巨大的负载,我不明白为什么这很重要。与尝试自己动手相比,仅使用它可能会花费更少的时间。
  • @jpmc26 现在我们只有 1 个要以这种方式分发的包。另外 Pypicloud 似乎还不支持 Python 3。我们所有的代码都在 Python 3 中。
  • @jpmc26 我知道发生了什么。我使用 pypicloud doc 中的“python3 setup.py bdist_wheel upload -r pypicloud”来构建源代码分发。我真正应该做的是“python3 setup.py bdist_wheel upload -r pypicloud”来构建一个wheel文件然后上传。它有效。
  • @LukasGraf 评论的更新链接:Hosting your own Simple Repository

标签: python amazon-s3 pip


【解决方案1】:

AWS S3 可用作 pypi 服务器,只需最少的配置且无需其他额外依赖项。

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

在 S3 中创建存储桶后,转到其属性,单击静态网站托管卡并启用选项使用此存储桶托管网站。记下单选按钮上方提到的端点

以下是您必须如何排列文件夹和文件 (docs):

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

包文件夹中的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>

车轮包装必须遵循正确的命名约定。详情请参阅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>

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

另外,修改您的存储桶权限以将软件包限制为目标客户端。一种方法是:
选择桶中的Permissions标签 --> Edit Bucket Policy

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

【讨论】:

  • 在打包阶段我应该将 setup.py 放在哪里?在每个库文件夹内部还是外部?
  • setup.py 是您的 .whl 包的一部分。
  • 我的意思是,要获得像您展示的那样的结构,我应该如何构建我的库?我应该将 setup.py 放在每个子文件夹中吗?
  • 我的回答中没有提到setup.py
  • @3nomis 我认为您最好在 StackOverflow 上提出自己的顶级问题。这个是关于托管包的,而不是关于制作包的。我认为您在术语包和模块之间有些混淆。一个包包含模块。一个包有一个 setup.py。包存储库托管包。我不确定您所说的分包是什么意思。在顶级问题中,您可以比这里更好地解释并获得更合适的答案。
【解决方案2】:

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

希望对你有帮助!

【讨论】:

    【解决方案3】:

    如何将 whl 文件(例如 yourpkg-1.0-py3-none-any.whl)包含在另一个具有确定名称的 zip 文件(例如 yourpkg.zip)中。然后你可以设置一些 cron 脚本在本地检查确定性密钥是否有新的 s3 文件,如果有则解压缩 whl 并安装它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多