跳转到主要内容

通过散列编辑您的requirements.txt文件

项目描述

https://github.com/peterbe/hashin/workflows/Python/badge.svg https://badge.fury.io/py/hashin.svg

帮助您使用散列编写requirements.txt文件,以便您可以使用pip install --require-hashes -r ...进行安装。

如果您想添加包或编辑您当前使用的包的版本,您必须执行以下步骤

  1. 转到该包的pypi

  2. 下载.tgz文件

  3. 可能下载.whl文件

  4. 运行pip hash downloadedpackage-1.2.3.tgz

  5. 运行pip hash downloadedpackage-1.2.3.whl

  6. 编辑requirements.txt

此脚本执行所有这些操作。非常巧妙。

警告词!

散列的整个目的是您要审查您笔记本电脑上使用的包,并且它们没有被篡改。然后您可以在服务器上放心地安装它们。

此工具从PyPI(通过HTTPS)下载,并在下载的文件上运行pip hash

您应该检查下载的软件包是否正常且未被篡改。您可以通过运行带有--verbose标志的hashin来完成此操作。这样做时,它会打印下载的相关文件位置,并且不会删除这些文件。例如:

$ hashin --verbose bgg /tmp/reqs.txt
https://pypi.python.org/pypi/bgg/json
* Latest version for 0.22.1
* Found URL https://pypi.python.org/packages/2.7/b/bgg/bgg-0.22.1-py2-none-any.whl
*   Re-using /var/folders/1x/2hf5hbs902q54g3bgby5bzt40000gn/T/bgg-0.22.1-py2-none-any.whl
*   Hash e5172c3fda0e8a42d1797fd1ff75245c3953d7c8574089a41a219204dbaad83d
* Found URL https://pypi.python.org/packages/source/b/bgg/bgg-0.22.1.tar.gz
*   Re-using /var/folders/1x/2hf5hbs902q54g3bgby5bzt40000gn/T/bgg-0.22.1.tar.gz
*   Hash aaa53aea1cecb8a6e1288d6bfe52a51408a264a97d5c865c38b34ae16c9bff88
* Editing /tmp/reqs.txt

您可能没有时间逐行查看,但您应该知道审查过程是您的责任。

安装

这通常只在开发环境中进行,或者说是您笔记本电脑上的操作。

pip install hashin

如何使用

假设您想安装futures。您可以选择这样做

hashin futures

这将下载最新版本的tarball(和wheel),并计算它们的pip散列值,并编辑您的requirements.txt文件。

或者,您可以具体指定所需的版本

hashin "futures==2.1.3"

您也可以同时指定多个软件包

hashin "futures==2.1.3" requests

如果您没有在同一个目录下找到requirements.txt,则可以指定--requirements-file

hashin futures --requirements-file=stuff/requirements/prod.txt

默认情况下使用sha256散列值,但可以使用--algorithm参数来覆盖

hashin futures --algorithm=sha512

如果没有输出,则表示操作成功。检查它如何编辑您的requirements文件。

按Python版本筛选版本

某些需求针对不同版本的Python和不同架构构建了多个版本。在某些情况下,这些散列值没有用,如果这些wheel与您的项目不兼容。hashin可以根据Python版本进行筛选,跳过这些无关的散列值。

例如,cffi软件包为从2.6到3.5的多个版本的CPython构建了wheel。要选择其中之一,您可以使用--python-version选项

hashin "cffi==1.5.2" --python-version 3.5

如果您需要支持多个版本,您可以多次传递此选项

hashin "cffi==1.5.2" --python-version 2.7 --python-version 3.5

hashin会将这些Python版本扩展到PyPI上可能找到的完整标识符列表。例如,3.5将扩展以匹配3.5、py3、py3.5、py2.py3或cp3.5中的任何一个。如果您需要特定的标识符,您也可以直接指定这些标识符。

source版本始终自动包含在内。如果找不到合适的wheel,pip将使用此版本作为后备。

模拟运行模式

在某些情况下,您可能不想立即编辑您的requirements.txt。您可以使用--dry-run参数来显示差异,以便您可以预览对您的requirements.txt文件的更改。

示例

hashin --dry-run requests==2.19.1

将在命令行上打印输出

--- Old
+++ New
@@ -0,0 +1,3 @@
+requests==2.19.1 \
+    --hash=sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1 \
+    --hash=sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a

PEP-0496环境标记

需求可以使用PEP-0496风格的指定符(例如,类似于cffi==1.5.2; python_version >= '3.4'),这些指定符将在重写requirements.txt文件时传递。hashin不会解析这些指定符本身,并将接受分号后面的任何内容。如果您使用python_version,如果您不希望获取所有可用的散列值,您仍然需要传递适当的选项。

这可能的一个例子是

hashin "pywin32-ctypes ; sys_platform == 'win32'"

这将导致在 requirements.txt 文件中出现类似的内容

pywin32-ctypes==0.1.2; sys_platform == 'win32' \
    --hash=sha256:4820b830f42e6889d34142bcd07b3896018c3620d8c31f5e13b72caf1f4d1d0f

如果您想限制它只适用于特定的 Python 版本,这里有一个示例

hashin "cffi==1.5.2; python_version >= '3.4'" -p 3.4 -p 3.5

作为 Python 库使用

您可以在命令行上使用 hashin 做的事情,在运行 Python 时也可以做。例如

import hashin
from pprint import pprint
pprint(hashin.get_package_hashes('Django'))

这将打印出

{'hashes': [{'hash': 'fbc7ffaa45a4a67cb45f77dbd94e8eceecebe1d0959fe9c665dfbf28b41899e6',
         'url': 'https://pypi.python.org/packages/41/c1/68dd27946b03a3d756b0ff665baad25aee1f59918891d86ab76764209208/Django-1.11b1-py2.py3-none-any.whl'}],
'package': 'Django',
'version': '1.11b1'}

或者使用特定的版本、算法和特定的 Python 版本

import hashin
from pprint import pprint
pprint(hashin.get_package_hashes(
    'Django',
    version='1.10',
    algorithm='sha512',
    python_versions=('3.5',)
))

本地开发

在您克隆了项目,创建了虚拟环境和运行后

pip install -e “.[dev]”

现在,要运行它,您可以使用已安装的可执行文件 hashin 并执行类似操作

touch /tmp/reqs.txt
hashin -r /tmp/reqs.txt Django

运行测试

只需运行

python setup.py test

当您使用 pip install ".[dev]" 时,它将安装 tox,您可以使用它在不同的 Python 环境中运行完整的测试套件(包括代码风格检查)

tox

使用测试覆盖率运行测试

要使用测试覆盖率运行测试,使用 pytest 运行类似以下内容

$ pip install pytest-cover
$ pytest --cov=hashin --cov-report=html
$ open htmlcov/index.html

调试

为了避免仅为了测试或调试功能而安装 hashin,您可以简单地这样运行

touch /tmp/whatever.txt
python hashin.py --verbose Django /tmp/whatever.txt

代码风格

所有 Python 代码都应该通过 Black 运行。这在 CI 中进行检查,您也可以使用 tox 在本地测试它。

此外,此项目使用 pre-commit,它作为 git 预提交钩子帮助检查代码风格。 pre-committox 中使用。要运行所有代码风格检查,请使用 tox -e lint,但请确保您的 tox 版本是在 Python 3 上构建的。

历史

此程序是 https://pypi.python.org/pypi/peepin 的“分支”peepin 是程序 peep 的伴侣 https://pypi.python.org/pypi/peep/,但自版本 8 以来,peep 的功能已直接放入 pip 中。

未来

如果此脚本证明其可行且有用,我希望我们可以直接将其放入 pip

版本历史

1.0.2
1.0.1
  • 更新关于 1.0.0 版本的变更日志。

1.0.0
  • 更新 setup.pytox.ini 和 GitHub Actions 以使用 Python >=3.8 和最高至 3.12。

0.17.0
0.16.0
0.15.0
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.4
0.13.3
0.13.2
  • 除此外,还可以按 py{major}{minor} 匹配 Python 版本。解决了安装类似 Paste-2.0.3-py34-none-any.whl 的文件时的问题。感谢 @danfoster!

0.13.1
  • 当您尝试添加一个仅包含预发布版本的软件包时,可以传递 --include-prereleases

0.13.0
  • hashin 添加了两个新依赖项:pip-apipackaging。这意味着我们不再需要 导入 pip 并依赖私有 API。感谢 @di!这也意味着您不能再在 Python 2.6 和 Python <=3.3 上安装 hashin

0.12.0
  • pypi.python.org/pypi/<package>/json 切换到 pypi.org/pypi/<package>/json,这意味着 sha256 哈希现在立即是 JSON 有效负载的一部分,而不是需要下载并运行 pip 来获取哈希。

  • 测试不运行 Python 2.6 和 Python 3.3。

  • 每个软件包的所有哈希按哈希值排序,使其更具可预测性。

0.11.5
  • 现在您可以与软件包名称一起传递 PEP-0496 环境标记,并且它们会传递到 requirements.txt 文件中。感谢 @meejah

0.11.4
  • 在 CLI 中发生的 PackageErrors 只抑制错误消息到 stderr。不再有完整的跟踪信息。

0.11.3
  • 如果您拼写包名有误,将得到更好的错误,因为 PyPI 上的 404 错误。

0.11.2
  • 也使用 Python 3.6 运行持续集成测试。

0.11.1
0.11.0
0.10.0
  • 现在通过查看 JSON 有效负载中发布列表中的所有版本号来确定最新版本。跳过预发布版本。

0.9.0
  • 修复了一个错误,它会导致无法安装名称部分属于现有(已安装)包的软件包。例如,当 django-redis==a.b.c 已在需求文件中时,安装 redis==x.y.z

0.8.0
  • 使 hashin 能够作为库运行。感谢 @jayfk!

  • pep8 清理。

0.7.2
0.7.1
  • 软件包匹配现在是不区分大小写的。例如,hashin dJaNgO

0.7.0
  • 现在,需求文件和算法参数现在是关键字参数。现在,第二个、第三个、第 n 个位置参数是附加参数。感谢 @https://github.com/ahal

0.6.1
  • 支持打包为 .msi 文件的 Windows 二进制文件。

0.6.0
  • 修复与 pip 8.1.2 和 8.1.1-2ubuntu0.1 的兼容性问题,并停止支持 Python 2.6

0.5.0
  • 重要的错误修复。例如,如果您在 requirements.txt 文件中已经有 pytest-selenium==...,并添加 selenium==x.y.z,它也会修改 pytest-selenium 的行。

0.4.1
  • 支持具有哈希的 PyPI 链接的文件 URL。

0.4.1
  • 修复未定义 Python 版本时的 PackageError。

0.4
  • 添加按 Python 版本过滤软件包发布的功能。

0.3
  • 对 Python 版本低于 2.7.9 的用户发出警告。

0.2
  • 最后一个字符是 单个 换行符。不是两个。

0.1
  • 首先是希望正常工作的版本。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

hashin-1.0.2.tar.gz (17.1 kB 查看哈希值)

上传时间 源代码

构建分发

hashin-1.0.2-py2.py3-none-any.whl (16.4 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者