0

我正在使用https://github.com/jazzband/pip-tools来处理编译 Django 项目的 requirements.txt。

以前,我在没有 setup.py 的情况下使用,所以我使用的是 base.in、local.in 和 production.in。

当我完成 pip-compile 后需要一个 local requirements.txt 时,我只是运行pip-sync base.txt local.txt它,它将安装本地环境的要求。

当我完成 pip-compile 后需要生产 requirements.txt 时,我只需运行pip-sync base.txt production.txt它就会安装生产环境的要求。

所以我放弃使用 base.in 是因为我还想锁定 python 版本,我意识到 setup.py 和 setup.cfg 可以帮助使用python_requires

但是现在我不确定如何使用 setup.py 和 setup.cfg 以及 pip-tools 来编译可以是特定于环境的 requirements.txt。

分层需求的唯一文档是使用 README 中编写的不同 .in 文件,如https://github.com/jazzband/pip-tools#workflow-for-layered-requirements

所以我的问题是:

鉴于:

  1. 点子工具
  2. setup.py 和 setup.cfg

怎么还有分层需求?

4

2 回答 2

2

pip-tools也可以顺利工作setup.py。您只需要在不提供*.in文件的情况下运行它。

与 setup.py 和文件混合的变体:

因此,假设您具有以下结构:

# setup.py replacing the base.in file
from distutils.core import setup


setup(
    name="MyLibrary",
    version="1.0",
    install_requires=[
        "requests",
        "bcrypt",
    ]
)

和一个 local.in 文件:

django

您需要执行以下操作来编译依赖项:

$ pip-compile -o base.txt 
$ pip-compile local.in
$ pip-sync base.txt local.txt

$ pip-compile -o base.txtsetup.py使用base.txt作为输出文件生成依赖项。它默认为requirements.txt. $ pip-compile local.in与您之前所做的相同,就像pip-sync不变的部分一样。

所以这里唯一的魔力是在pip-compile不提供输入文件的情况下运行。

Setup.py 唯一解决方案:

Setup.py 支持extras_require哪个是命名可选依赖项的字典:

[...]
    extras_require={
        "local": ["pytest"],
    },
[...]

pip-tools 有一个选项extra

$ pip-compile --help |grep extra
  --extra TEXT     Name of an extras_require group to install;

因此,您可以执行以下操作:

pip-compile --extra local -o local.txt
pip-compile --extra production -o production.txt

输出文件包含install_requires指定的额外要求中的所有要求。

之后您只需同步 local/production.txt:

$ pip-sync local.txt
$ pip-sync production.txt

如果我是你,我会选择纯 setup.py 变体。

于 2022-02-10T05:58:39.603 回答
-2

你能检查一下pipenv吗?pipenv 对依赖项使用 Pipfile 和 Pipfile.lock 而不是 requirements.txt。它在您安装的依赖项和依赖项的依赖项之间有明确的分离。

检查下面的这个样本会更清楚:

╰─ pipenv graph                                                                                                                                                  ─╯
boto3==1.20.38
  - botocore [required: >=1.23.38,<1.24.0, installed: 1.23.38]
    - jmespath [required: >=0.7.1,<1.0.0, installed: 0.10.0]
    - python-dateutil [required: >=2.1,<3.0.0, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - urllib3 [required: >=1.25.4,<1.27, installed: 1.26.8]
  - jmespath [required: >=0.7.1,<1.0.0, installed: 0.10.0]
  - s3transfer [required: >=0.5.0,<0.6.0, installed: 0.5.0]
    - botocore [required: >=1.12.36,<2.0a.0, installed: 1.23.38]
      - jmespath [required: >=0.7.1,<1.0.0, installed: 0.10.0]
      - python-dateutil [required: >=2.1,<3.0.0, installed: 2.8.2]
        - six [required: >=1.5, installed: 1.16.0]
      - urllib3 [required: >=1.25.4,<1.27, installed: 1.26.8]
colorama==0.4.4
pylint==2.12.2
  - astroid [required: >=2.9.0,<2.10, installed: 2.9.3]
    - lazy-object-proxy [required: >=1.4.0, installed: 1.7.1]
    - setuptools [required: >=20.0, installed: 58.1.0]
    - typing-extensions [required: >=3.10, installed: 4.0.1]
    - wrapt [required: >=1.11,<1.14, installed: 1.13.3]
  - isort [required: >=4.2.5,<6, installed: 5.10.1]
  - mccabe [required: >=0.6,<0.7, installed: 0.6.1]
  - platformdirs [required: >=2.2.0, installed: 2.4.1]
  - toml [required: >=0.9.2, installed: 0.10.2]
  - typing-extensions [required: >=3.10.0, installed: 4.0.1]
pytest-cov==3.0.0
  - coverage [required: >=5.2.1, installed: 6.0.2]
  - pytest [required: >=4.6, installed: 6.2.5]
    - attrs [required: >=19.2.0, installed: 21.2.0]
    - iniconfig [required: Any, installed: 1.1.1]
    - packaging [required: Any, installed: 21.0]
      - pyparsing [required: >=2.0.2, installed: 2.4.7]
    - pluggy [required: >=0.12,<2.0, installed: 1.0.0]
    - py [required: >=1.8.2, installed: 1.10.0]
    - toml [required: Any, installed: 0.10.2]
PyYAML==6.0
requests==2.27.1
  - certifi [required: >=2017.4.17, installed: 2021.10.8]
  - charset-normalizer [required: ~=2.0.0, installed: 2.0.10]
  - idna [required: >=2.5,<4, installed: 3.3]
  - urllib3 [required: >=1.21.1,<1.27, installed: 1.26.8]
tomli==1.2.1

它还支持这样的 dev 和 prod 包定义:

╰─ cat Pipfile                                                                                                                                                   ─╯
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
colorama = "*"
boto3 = "*"
pyyaml = "*"
requests = "*"
pylint = "*"

[dev-packages]
pytest = "*"
pytest-cov = "*"

[requires]
python_version = "3.9"

有关更多详细信息,请查看此链接: https ://realpython.com/pipenv-guide/

还要检查 pipenv 中的多个环境: Pipenv: Multiple Environments

于 2022-02-08T16:19:35.433 回答