pip
기반 패키지를 고정한 경우에도 최신 상태로 유지하는 데 도움이 되는 명령줄 도구 세트입니다. 당신은 그것을 고정합니까, 그렇죠? (Python 애플리케이션과 프로덕션을 위한 종속성을 구축할 때 빌드가 예측 가능하고 결정적인지 확인하려고 합니다.)
pip
와 유사하게 pip-tools
각 프로젝트의 가상 환경에 설치되어야 합니다.
$ source /path/to/venv/bin/activate
(venv) $ python -m pip install pip-tools
참고 : 나머지 모든 예제 명령은 프로젝트의 가상 환경을 활성화했다고 가정합니다.
pip-compile
사용 예 pip-compile
명령을 사용하면 pyproject.toml
, setup.cfg
, setup.py
또는 requirements.in
.in 에 지정된 종속성에서 requirements.txt
파일을 컴파일할 수 있습니다.
pip-compile
또는 python -m piptools compile
(또는 pipx
적절한 Python 버전으로 설치된 경우 pipx run --spec pip-tools pip-compile
)을 사용하여 실행하십시오. 여러 Python 버전을 사용하는 경우 Windows에서는 py -XY -m piptools compile
실행하고 다른 시스템에서는 pythonX.Y -m piptools compile
실행할 수도 있습니다.
pip-compile
프로젝트와 동일한 가상 환경에서 실행되어야 특정 Python 버전이나 기타 환경 마커가 필요한 조건부 종속성이 프로젝트 환경에 따라 해결됩니다.
참고 : pip-compile
종속성을 충족하는 기존 requirements.txt
파일을 찾으면 업데이트가 가능하더라도 변경 사항이 적용되지 않습니다. 처음부터 컴파일하려면 먼저 기존 requirements.txt
파일을 삭제하거나 대체 접근 방식에 대한 요구 사항 업데이트를 참조하세요.
pyproject.toml
의 요구 사항 pyproject.toml
파일은 패키지 및 애플리케이션 구성을 위한 최신 표준이며 새 프로젝트에 권장됩니다. pip-compile
project.dependencies
와 project.optional-dependencies
설치를 모두 지원합니다. 이것이 공식 표준이라는 사실 덕분에 Setuptools, Hatch 또는 flit와 같은 최신 표준 준수 패키징 도구를 사용하는 프로젝트에서 pip-compile
사용하여 종속성을 고정할 수 있습니다.
Setuptools
사용하여 패키징된 'foobar' Python 애플리케이션이 있고 이를 프로덕션용으로 고정하려고 한다고 가정해 보겠습니다. 프로젝트 메타데이터를 다음과 같이 선언할 수 있습니다.
[ build-system ]
requires = [ " setuptools " , " setuptools-scm " ]
build-backend = " setuptools.build_meta "
[ project ]
requires-python = " >=3.9 "
name = " foobar "
dynamic = [ " dependencies " , " optional-dependencies " ]
[ tool . setuptools . dynamic ]
dependencies = { file = [ " requirements.in " ] }
optional-dependencies.test = { file = [ " requirements-test.txt " ] }
Hatch
사용하여 패키징된 Django 애플리케이션이 있고 이를 프로덕션용으로 고정하려는 경우. 또한 개발 도구를 별도의 핀 파일에 고정하고 싶을 수도 있습니다. django
종속성으로 선언하고 pytest
포함하는 선택적 종속성 dev
만듭니다.
[ build-system ]
requires = [ " hatchling " ]
build-backend = " hatchling.build "
[ project ]
name = " my-cool-django-app "
version = " 42 "
dependencies = [ " django " ]
[ project . optional-dependencies ]
dev = [ " pytest " ]
다음과 같이 쉽게 핀 파일을 생성할 수 있습니다.
$ pip-compile -o requirements.txt pyproject.toml
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --output-file=requirements.txt pyproject.toml
#
asgiref==3.6.0
# via django
django==4.1.7
# via my-cool-django-app (pyproject.toml)
sqlparse==0.4.3
# via django
$ pip-compile --extra dev -o dev-requirements.txt pyproject.toml
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --extra=dev --output-file=dev-requirements.txt pyproject.toml
#
asgiref==3.6.0
# via django
attrs==22.2.0
# via pytest
django==4.1.7
# via my-cool-django-app (pyproject.toml)
exceptiongroup==1.1.1
# via pytest
iniconfig==2.0.0
# via pytest
packaging==23.0
# via pytest
pluggy==1.0.0
# via pytest
pytest==7.2.2
# via my-cool-django-app (pyproject.toml)
sqlparse==0.4.3
# via django
tomli==2.0.1
# via pytest
이는 애플리케이션을 고정하는 동시에 오픈 소스 Python 패키지의 CI를 안정적으로 유지하는 데에도 유용합니다.
setup.py
및 setup.cfg
의 요구사항 pip-compile
setuptools
사용하는 setup.py
및 setup.cfg
기반 프로젝트도 완벽하게 지원합니다.
평소와 같이 종속성과 추가 항목을 정의하고 위와 같이 pip-compile
실행하십시오.
requirements.in
의 요구사항 요구 사항에 따라 일반 텍스트 파일을 사용할 수도 있습니다(예: 응용 프로그램을 패키지로 만들지 않으려는 경우). requirements.in
파일을 사용하여 Django 종속성을 선언하려면 다음을 수행하세요.
# requirements.in
django
이제 pip-compile requirements.in
을 실행하십시오.
$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile requirements.in
#
asgiref==3.6.0
# via django
django==4.1.7
# via -r requirements.in
sqlparse==0.4.3
# via django
그리고 모든 Django 종속성(및 모든 기본 종속성)이 고정된 requirements.txt
생성합니다.
(업데이트 요구 사항)=
pip-compile
지원되는 파일에 지정한 종속성을 충족하는 최신 버전을 사용하여 requirements.txt
파일을 생성합니다.
pip-compile
종속성을 충족하는 기존 requirements.txt
파일을 찾으면 업데이트가 가능하더라도 변경 사항이 적용되지 않습니다.
pip-compile
기존 requirements.txt
의 모든 패키지를 강제로 업데이트하도록 하려면 pip-compile --upgrade
실행하세요.
특정 패키지를 최신 또는 특정 버전으로 업데이트하려면 --upgrade-package
또는 -P
플래그를 사용하십시오.
# only update the django package
$ pip-compile --upgrade-package django
# update both the django and requests packages
$ pip-compile --upgrade-package django --upgrade-package requests
# update the django package to the latest, and requests to v2.0.0
$ pip-compile --upgrade-package django --upgrade-package requests==2.0.0
--upgrade
와 --upgrade-package
하나의 명령으로 결합하여 허용되는 업그레이드에 대한 제약 조건을 제공할 수 있습니다. 예를 들어 요청을 3.0 미만의 최신 버전으로 제한하면서 모든 패키지를 업그레이드하려면 다음을 수행하세요.
$ pip-compile --upgrade --upgrade-package ' requests<3.0 '
버전 8.0부터 pip
에서 사용할 수 있는 해시 검사 모드를 사용하려는 경우 pip-compile
--generate-hashes
플래그를 제공합니다.
$ pip-compile --generate-hashes requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --generate-hashes requirements.in
#
asgiref==3.6.0
--hash=sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac
--hash=sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506
# via django
django==4.1.7
--hash=sha256:44f714b81c5f190d9d2ddad01a532fe502fa01c4cb8faf1d081f4264ed15dcd8
--hash=sha256:f2f431e75adc40039ace496ad3b9f17227022e8b11566f4b363da44c7e44761e
# via -r requirements.in
sqlparse==0.4.3
--hash=sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34
--hash=sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268
# via django
requirements.txt
이외의 파일 이름으로 고정된 요구 사항을 출력하려면 --output-file
사용하십시오. 이는 여러 파일을 컴파일하는 데 유용할 수 있습니다. 예를 들어 tox를 사용하여 두 버전이 모두 포함된 라이브러리를 테스트하기 위해 django에 대해 서로 다른 제약 조건을 적용한 경우입니다.
$ pip-compile --upgrade-package ' django<1.0 ' --output-file requirements-django0x.txt
$ pip-compile --upgrade-package ' django<2.0 ' --output-file requirements-django1x.txt
또는 표준 출력으로 출력하려면 --output-file=-
사용하십시오.
$ pip-compile --output-file=- > requirements.txt
$ pip-compile - --output-file=- < requirements.in > requirements.txt
pip
로 전달 옵션 유효한 pip
플래그 또는 인수는 pip-compile
의 --pip-args
옵션을 사용하여 전달될 수 있습니다. 예:
$ pip-compile requirements.in --pip-args " --retries 10 --timeout 30 "
요구 사항 입력 파일과 동일한 디렉터리(또는 stdin에서 입력을 파이프하는 경우 현재 작업 디렉터리)에 있는 구성 파일에 작성하여 pip-compile
및 pip-sync
대한 프로젝트 수준 기본값을 정의할 수 있습니다. 기본적으로 pip-compile
과 pip-sync
먼저 .pip-tools.toml
파일을 찾은 다음 pyproject.toml
찾습니다. --config
옵션을 사용하여 대체 TOML 구성 파일을 지정할 수도 있습니다.
전역적으로나 명령별로 구성 값을 지정할 수 있습니다. 예를 들어 결과 요구 사항 파일 출력에서 기본적으로 pip
해시를 생성하려면 구성 파일에 다음을 지정할 수 있습니다.
[ tool . pip-tools ]
generate-hashes = true
두 번 이상 사용할 수 있는 pip-compile
및 pip-sync
옵션은 값이 하나만 있는 경우에도 구성 파일에 목록으로 정의되어야 합니다.
pip-tools
해당 하위 명령의 모든 유효한 명령줄 플래그에 대한 기본값을 지원합니다. 구성 키에는 대시 대신 밑줄이 포함될 수 있으므로 위의 내용을 다음 형식으로 지정할 수도 있습니다.
[ tool . pip-tools ]
generate_hashes = true
pip-compile
및 pip-sync
와 관련된 구성 기본값은 별도의 섹션 아래에 배치할 수 있습니다. 예를 들어 기본적으로 pip-compile
사용하여 테스트 실행을 수행하려면 다음을 수행합니다.
[ tool . pip-tools . compile ] # "sync" for pip-sync
dry-run = true
이는 --dry-run
옵션이 있는 pip-sync
명령에는 영향을 주지 않습니다. 둘 다 선언될 때마다 로컬 설정이 동일한 이름의 전역 설정보다 우선하므로 pip-compile
해시를 생성하지만 전역 테스트 실행 설정은 삭제됩니다.
[ tool . pip-tools ]
generate-hashes = true
dry-run = true
[ tool . pip-tools . compile ]
dry-run = false
다른 스크립트에서 pip-compile
명령을 래핑하고 있을 수 있습니다. 사용자 정의 스크립트 소비자의 혼동을 피하기 위해 CUSTOM_COMPILE_COMMAND
환경 변수를 설정하여 요구 사항 파일 상단에 생성된 업데이트 명령을 재정의할 수 있습니다.
$ CUSTOM_COMPILE_COMMAND= " ./pipcompilewrapper " pip-compile requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# ./pipcompilewrapper
#
asgiref==3.6.0
# via django
django==4.1.7
# via -r requirements.in
sqlparse==0.4.3
# via django
서로 다르지만 호환되는 패키지를 설치해야 하는 다양한 환경이 있는 경우 계층화된 요구 사항 파일을 생성하고 한 계층을 사용하여 다른 계층을 제한할 수 있습니다.
예를 들어 프로덕션에서 최신 2.1
릴리스를 원하는 Django 프로젝트가 있고 개발할 때 Django 디버그 도구 모음을 사용하려는 경우 각 레이어에 하나씩 두 개의 *.in
파일을 만들 수 있습니다.
# requirements.in
django<2.2
개발 요구사항 dev-requirements.in
상단에서 -c requirements.txt
사용하여 requirements.txt
에서 프로덕션용으로 이미 선택한 패키지로 개발 요구사항을 제한합니다.
# dev-requirements.in
-c requirements.txt
django-debug-toolbar<2.2
먼저 평소와 같이 requirements.txt
컴파일합니다.
$ pip-compile
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile
#
django==2.1.15
# via -r requirements.in
pytz==2023.3
# via django
이제 개발 요구 사항을 컴파일하면 requirements.txt
파일이 제약 조건으로 사용됩니다.
$ pip-compile dev-requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile dev-requirements.in
#
django==2.1.15
# via
# -c requirements.txt
# django-debug-toolbar
django-debug-toolbar==2.1
# via -r dev-requirements.in
pytz==2023.3
# via
# -c requirements.txt
# django
sqlparse==0.4.3
# via django-debug-toolbar
위에서 볼 수 있듯이 Django 2.2
릴리스가 사용 가능하더라도 개발 요구 사항에는 Django 2.1
버전만 포함됩니다. 이제 컴파일된 두 가지 요구 사항 파일을 모두 개발 환경에 안전하게 설치할 수 있습니다.
프로덕션 단계에서 요구사항을 설치하려면 다음을 사용하세요.
$ pip-sync
다음을 통해 개발 단계에서 요구사항을 설치할 수 있습니다.
$ pip-sync requirements.txt dev-requirements.txt
사전 커밋을 위한 후크로 pip-compile
사용할 수 있습니다. 지침은 사전 커밋 문서를 참조하세요. 샘플 .pre-commit-config.yaml
:
repos :
- repo : https://github.com/jazzband/pip-tools
rev : 7.4.1
hooks :
- id : pip-compile
args
및/또는 files
구성하여 pip-compile
args를 사용자 정의할 수 있습니다. 예를 들면 다음과 같습니다.
repos :
- repo : https://github.com/jazzband/pip-tools
rev : 7.4.1
hooks :
- id : pip-compile
files : ^requirements/production.(in|txt)$
args : [--index-url=https://example.com, requirements/production.in]
요구 사항 파일이 여러 개인 경우 각 파일에 대한 후크를 만들어야 합니다.
repos :
- repo : https://github.com/jazzband/pip-tools
rev : 7.4.1
hooks :
- id : pip-compile
name : pip-compile setup.py
files : ^(setup.py|requirements.txt)$
- id : pip-compile
name : pip-compile requirements-dev.in
args : [requirements-dev.in]
files : ^requirements-dev.(in|txt)$
- id : pip-compile
name : pip-compile requirements-lint.in
args : [requirements-lint.in]
files : ^requirements-lint.(in|txt)$
- id : pip-compile
name : pip-compile requirements.in
args : [requirements.in]
files : ^requirements.(in|txt)$
pip-sync
사용 예 이제 requirements.txt
가 있으므로 pip-sync
사용하여 가상 환경을 업데이트하여 거기에 있는 내용을 정확하게 반영할 수 있습니다. 이렇게 하면 요구사항 requirements.txt
내용과 일치하는 데 필요한 모든 것이 설치/업그레이드/제거됩니다.
pip-sync
또는 python -m piptools sync
로 실행하세요. 여러 Python 버전을 사용하는 경우 Windows에서는 py -XY -m piptools sync
실행하고 다른 시스템에서는 pythonX.Y -m piptools sync
실행할 수도 있습니다.
설치하거나 업그레이드할 패키지를 식별하려면 프로젝트와 동일한 가상 환경에 pip-sync
설치하고 실행해야 합니다.
주의하세요 : pip-sync
pip-compile
에 의해 생성된 requirements.txt
와 함께만 사용되어야 합니다.
$ pip-sync
Uninstalling flake8-2.4.1:
Successfully uninstalled flake8-2.4.1
Collecting click==4.1
Downloading click-4.1-py2.py3-none-any.whl (62kB)
100% |................................| 65kB 1.8MB/s
Found existing installation: click 4.0
Uninstalling click-4.0:
Successfully uninstalled click-4.0
Successfully installed click-4.1
여러 *.txt
종속성 목록을 동기화하려면 명령줄 인수를 통해 전달하면 됩니다. 예:
$ pip-sync dev-requirements.txt requirements.txt
빈 인수를 전달하면 requirements.txt
으로 설정됩니다.
유효한 pip install
플래그 또는 인수는 pip-sync
의 --pip-args
옵션과 함께 전달될 수 있습니다. 예:
$ pip-sync requirements.txt --pip-args " --no-cache-dir --no-deps "
참고 : pip-sync
setuptools
, pip
또는 pip-tools
자체와 같은 패키징 도구를 업그레이드하거나 제거하지 않습니다. 해당 패키지를 업그레이드하려면 python -m pip install --upgrade
사용하세요.
requirements.in
및 requirements.txt
소스 제어에 커밋해야 합니까? 일반적으로 그렇습니다. 소스 제어에서 재현 가능한 환경 설치를 사용하려면 요구 requirements.in
과 requirements.txt
모두 소스 제어에 커밋해야 합니다.
여러 Python 환경에 배포하는 경우(아래 섹션 참조) 각 Python 환경에 대해 별도의 출력 파일을 커밋해야 합니다. {env}-requirements.txt
형식(예: win32-py3.7-requirements.txt
, macos-py3.10-requirements.txt
등)을 사용하는 것이 좋습니다.
requirements.in
/ requirements.txt
및 pip-compile
의 환경 간 사용패키지의 종속성은 해당 패키지가 설치된 Python 환경에 따라 변경될 수 있습니다. 여기서는 Python 환경을 운영 체제, Python 버전(3.7, 3.8 등) 및 Python 구현(CPython, PyPy 등)의 조합으로 정의합니다. 정확한 정의는 PEP 508 환경 마커의 가능한 조합을 참조하세요.
결과 requirements.txt
환경마다 다를 수 있으므로 사용자는 각 Python 환경에서 개별적으로 pip-compile
실행하여 해당 환경에 유효한 requirements.txt
생성해야 합니다. 동일한 requirements.in
필요에 따라 PEP 508 환경 마커를 사용하여 모든 환경의 소스 파일로 사용할 수 있습니다. 일반 pip
교차 환경 사용과 동일한 방식입니다.
생성된 requirements.txt
모든 Python 환경에서 정확히 동일하게 유지되면 Python 환경 전체에서 안전하게 사용할 수 있습니다. 그러나 패키지 업데이트로 인해 환경 종속성이 도입되어 새로 생성된 requirements.txt
도 환경 종속성이 될 수 있으므로 사용자는 주의해야 합니다. 일반적으로 문제를 방지하려면 사용자가 각 대상 Python 환경에서 항상 pip-compile
실행해야 하는 것이 좋습니다.
pip-tools
빌드의 재현성을 향상시키는 훌륭한 도구입니다. 그러나 명심해야 할 몇 가지 사항이 있습니다.
pip-compile
이전 섹션에서 설명한 대로 다양한 환경에서 다른 결과를 생성합니다.pip
PIP_CONSTRAINT
환경 변수와 함께 사용해야 합니다. 이전의 pyproject.toml
예제를 계속하면 다음과 같이 단일 잠금 파일을 생성할 수 있습니다.
$ pip-compile --all-build-deps --all-extras --output-file=constraints.txt --strip-extras pyproject.toml
#
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
# pip-compile --all-build-deps --all-extras --output-file=constraints.txt --strip-extras pyproject.toml
#
asgiref==3.5.2
# via django
attrs==22.1.0
# via pytest
backports-zoneinfo==0.2.1
# via django
django==4.1
# via my-cool-django-app (pyproject.toml)
editables==0.3
# via hatchling
hatchling==1.11.1
# via my-cool-django-app (pyproject.toml::build-system.requires)
iniconfig==1.1.1
# via pytest
packaging==21.3
# via
# hatchling
# pytest
pathspec==0.10.2
# via hatchling
pluggy==1.0.0
# via
# hatchling
# pytest
py==1.11.0
# via pytest
pyparsing==3.0.9
# via packaging
pytest==7.1.2
# via my-cool-django-app (pyproject.toml)
sqlparse==0.4.2
# via django
tomli==2.0.1
# via
# hatchling
# pytest
일부 빌드 백엔드는 PEP 517 및 PEP 660에 설명된 get_requires_for_build_
후크를 사용하여 빌드 종속성을 동적으로 요청할 수도 있습니다. 이는 다음 접미사 중 하나로 출력에 표시됩니다.
(pyproject.toml::build-system.backend::editable)
(pyproject.toml::build-system.backend::sdist)
(pyproject.toml::build-system.backend::wheel)
pip-compile-multi - 여러 상호 참조 요구 사항 파일을 위한 pip-compile 명령 래퍼입니다.
pipdeptree는 설치된 패키지의 종속성 트리를 인쇄합니다.
requirements.in
/ requirements.txt
구문 강조:
이 섹션에는 현재 더 이상 사용되지 않는 pip-tools
기능이 나열되어 있습니다.
--allow-unsafe
동작이 기본적으로 활성화됩니다(#989). 이전 동작을 유지하려면 --no-allow-unsafe
사용하세요. 다가오는 변경 사항에 적응하려면 지금 --allow-unsafe
전달하는 것이 좋습니다.--resolver=backtracking
입니다.--strip-extras
동작이 기본적으로 활성화됩니다(#1613). 이전 동작을 유지하려면 --no-strip-extras
사용하십시오.기본 역추적 확인자 또는 더 이상 사용되지 않는 레거시 확인자 중에서 선택할 수 있습니다.
레거시 해결 프로그램은 종속성을 해결하지 못하는 경우가 있습니다. 역추적 확인자는 더욱 강력하지만 일반적으로 실행하는 데 시간이 더 오래 걸릴 수 있습니다.
--resolver=legacy
사용하여 레거시 리졸버를 계속 사용할 수 있지만 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다.