通过散列编辑您的requirements.txt文件
项目描述
帮助您使用散列编写requirements.txt文件,以便您可以使用pip install --require-hashes -r ...进行安装。
如果您想添加包或编辑您当前使用的包的版本,您必须执行以下步骤
转到该包的pypi
下载.tgz文件
可能下载.whl文件
运行pip hash downloadedpackage-1.2.3.tgz
运行pip hash downloadedpackage-1.2.3.whl
编辑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-commit 在 tox 中使用。要运行所有代码风格检查,请使用 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
修复命令行参数 -p PYTHON_VERSION(和 API 函数 expand_python_version)以支持“3.10”及以上版本。请参阅 https://github.com/peterbe/hashin/pull/186
- 1.0.1
更新关于 1.0.0 版本的变更日志。
- 1.0.0
更新 setup.py、tox.ini 和 GitHub Actions 以使用 Python >=3.8 和最高至 3.12。
- 0.17.0
将 python 3.9 和 3.10 添加到测试矩阵中。
在更新需求文件时保留 get_releases_hashes 函数的输出中的词序。请参阅 https://github.com/peterbe/hashin/issues/126
- 0.16.0
在更新需求文件时保留缩进注释。请参阅 https://github.com/peterbe/hashin/issues/124
从 TravisCI 切换到 GitHub Actions。此外,在 Python 3.7 和 3.8 上测试 tox,并升级代码风格要求。请参阅 https://github.com/peterbe/hashin/pull/118
- 0.15.0
修正包名中使用下划线或短横线的问题。请参阅 https://github.com/peterbe/hashin/issues/116 感谢 @caphrim007
- 0.14.6
保留需求文件中的缩进。请参阅 https://github.com/peterbe/hashin/issues/112 感谢 @techtonik
如果你使用 --update-all 并在指定需求文件时忘记了 -r,它不会抱怨,而是会纠正意图。参见 https://github.com/peterbe/hashin/issues/104
- 0.14.5
现在写入哈希值时是按照字典顺序进行的。这使得对需求文件的写入更加可预测。参见 https://github.com/peterbe/hashin/issues/105
- 0.14.4
针对 0.14.3 版本中新 --index-url 选项特性的错误修复。参见 https://github.com/peterbe/hashin/issues/108
- 0.14.3
新增参数 --index-url,允许覆盖默认值 https://pypi.ac.cn。感谢 @nmacinnis。参见 https://github.com/peterbe/hashin/pull/107
- 0.14.2
当使用 --update-all 并解析需求文件时,可能会被类似包规范的注释(例如 # check out foo==1.0)所误导。参见 https://github.com/peterbe/hashin/issues/103
- 0.14.1
所有用于从 PyPI 获取包信息的 HTTP GET 请求都是在并发线程中完成的。需要 Python 2.7 的回滚。参见 https://github.com/peterbe/hashin/issues/101
- 0.14.0
--interactive(当你使用 --update-all 时)会遍历你的需求文件中的所有过时版本,并对每个版本询问你是否要更新它。参见 https://github.com/peterbe/hashin/issues/90
哈希值的顺序不应该影响需求文件中的包是否需要替换。参见 https://github.com/peterbe/hashin/issues/93
(内部)所有测试都已重写为纯 pytest 函数。
在 Python 3 中,如果找不到包,你会得到一个更明确的异常,指出哪个包(URL)失败。参见 https://github.com/peterbe/hashin/issues/87
新增标志 --update-all(别名 -u),将解析需求文件,忽略版本,并更新所有有新版本的包。参见 https://github.com/peterbe/hashin/pull/88
支持“额外语法”。例如,hashin "requests[security]"。实际上不会为 security 获取哈希值(在这种情况下,这甚至不是一个包),但允许这种语法出现在你的 requirements.txt 文件中。参见 https://github.com/peterbe/hashin/issues/70
现在所有代码都使用 Black 进行格式化。
- 0.13.4
通过 --dry-run 传递,它会打印出它将对你的需求文件执行的操作的差异。参见 https://github.com/peterbe/hashin/pull/78
当没有版本但找到一些预发布版本时,错误信息更好。参见 https://github.com/peterbe/hashin/issues/76
使用 --verbose 时,如果不需要下载文件,则不要显示 URL。参见 https://github.com/peterbe/hashin/issues/73
- 0.13.3
使得在 Windows 上安装 nltk 成为可能。感谢 @chrispbailey!
- 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-api 和 packaging。这意味着我们不再需要 导入 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
现在可以运行 hashin --version 来查看已安装的 hashin 版本。见 https://github.com/peterbe/hashin/issues/41
- 0.11.0
在确定最新版本时处理版本号中的前导零。见 https://github.com/peterbe/hashin/issues/39
- 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
修复与安装平台特定存档相关的错误。见 https://github.com/peterbe/hashin/pull/33 感谢 @mythmon
- 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
首先是希望正常工作的版本。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。