Skip to content

의존성 관리

의존성 테이블

프로젝트의 의존성은 여러 테이블에 정의된다:

참고

project.dependenciesproject.optional-dependencies 테이블은 프로젝트가 공개되지 않더라도 사용할 수 있다. dependency-groups는 최근에 표준화된 기능이므로 아직 모든 도구에서 지원되지 않을 수 있다.

uv는 uv adduv remove 명령어를 통해 프로젝트의 의존성을 수정할 수 있지만, pyproject.toml 파일을 직접 편집해도 의존성 메타데이터를 업데이트할 수 있다.

의존성 추가하기

의존성을 추가하려면 다음 명령어를 사용한다:

$ uv add httpx

project.dependencies 테이블에 항목이 추가된다:

pyproject.toml
[project]
name = "example"
version = "0.1.0"
dependencies = ["httpx>=0.27.2"]

--dev, --group, 또는 --optional 플래그를 사용해 다른 테이블에 의존성을 추가할 수 있다.

의존성에는 패키지의 최신 호환 버전을 위한 제약 조건(예: >=0.27.2)이 포함된다. 다른 제약 조건을 지정할 수도 있다:

$ uv add "httpx>=0.20"

패키지 레지스트리가 아닌 다른 소스에서 의존성을 추가하면, uv는 소스 테이블에 항목을 추가한다. 예를 들어 GitHub에서 httpx를 추가할 경우:

$ uv add "httpx @ git+https://github.com/encode/httpx"

pyproject.toml에는 Git 소스 항목이 포함된다:

pyproject.toml
[project]
name = "example"
version = "0.1.0"
dependencies = [
    "httpx",
]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx" }

의존성을 사용할 수 없는 경우 uv는 오류를 표시한다:

$ uv add "httpx>9999"
  × No solution found when resolving dependencies:
  ╰─▶ Because only httpx<=1.0.0b0 is available and your project depends on httpx>9999,
      we can conclude that your project's requirements are unsatisfiable.

의존성 임포트

requirements.txt 파일에 선언된 의존성은 -r 옵션을 사용해 프로젝트에 추가할 수 있다:

uv add -r requirements.txt

의존성 제거 방법

의존성을 제거하려면 다음 명령어를 사용한다:

$ uv remove httpx

--dev, --group, --optional 플래그를 사용하면 특정 테이블에서 의존성을 제거할 수 있다.

제거하려는 의존성에 대해 소스가 정의되어 있고, 해당 의존성을 참조하는 다른 항목이 없다면 소스도 함께 제거된다.

의존성 변경

기존 의존성을 변경하려면, 예를 들어 httpx에 대해 다른 제약 조건을 사용하려면 다음과 같이 한다:

$ uv add "httpx>0.1.0"

참고

이 예제에서는 pyproject.toml 파일에 있는 의존성의 제약 조건을 변경한다. 의존성의 잠긴 버전은 새로운 제약 조건을 충족하기 위해 필요한 경우에만 변경된다. 제약 조건 내에서 최신 패키지 버전으로 강제 업데이트하려면 --upgrade-package <name>을 사용한다. 예를 들어:

$ uv add "httpx>0.1.0" --upgrade-package httpx

패키지 업그레이드에 대한 자세한 내용은 lockfile 문서를 참고한다.

다른 의존성 소스를 요청하면 tool.uv.sources 테이블이 업데이트된다. 예를 들어 개발 중에 로컬 경로에서 httpx를 사용하려면 다음과 같이 한다:

$ uv add "httpx @ ../httpx"

플랫폼별 의존성

특정 플랫폼이나 특정 Python 버전에서만 의존성을 설치하려면 환경 마커를 사용한다.

예를 들어, Linux에서만 jax를 설치하고 Windows나 macOS에서는 설치하지 않으려면 다음과 같이 입력한다:

$ uv add "jax; sys_platform == 'linux'"

그러면 pyproject.toml 파일에 환경 마커가 포함된 의존성 정의가 추가된다:

pyproject.toml
[project]
name = "project"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = ["jax; sys_platform == 'linux'"]

마찬가지로, Python 3.11 이상에서만 numpy를 포함하려면 다음과 같이 입력한다:

$ uv add "numpy; python_version >= '3.11'"

사용 가능한 마커와 연산자의 전체 목록은 Python의 환경 마커 문서를 참고한다.

Tip

의존성 소스를 플랫폼별로 변경할 수도 있다.

프로젝트 의존성

project.dependencies 테이블은 PyPI에 업로드하거나 휠을 빌드할 때 사용되는 의존성을 나타낸다. 각 의존성은 의존성 명세자 구문을 사용하여 지정되며, 이 테이블은 PEP 621 표준을 따른다.

project.dependencies는 프로젝트에 필요한 패키지 목록과 설치 시 사용해야 하는 버전 제약 조건을 정의한다. 각 항목은 의존성 이름과 버전을 포함한다. 항목에는 플랫폼별 패키지를 위한 추가 기능이나 환경 마커가 포함될 수도 있다. 예를 들면 다음과 같다:

pyproject.toml
[project]
name = "albatross"
version = "0.1.0"
dependencies = [
  # 이 범위 내의 모든 버전
  "tqdm >=4.66.2,<5",
  # 정확히 이 버전의 torch
  "torch ==2.2.2",
  # torch 추가 기능과 함께 transformers 설치
  "transformers[torch] >=4.39.3,<5",
  # 오래된 파이썬 버전에서만 이 패키지 설치
  # "환경 마커" 섹션에서 더 많은 정보 확인
  "importlib_metadata >=7.1.0,<8; python_version < '3.10'",
  "mollymawk ==0.1.0"
]

의존성 소스

tool.uv.sources 테이블은 표준 의존성 테이블을 확장해 개발 중에 사용할 수 있는 대체 의존성 소스를 제공한다.

의존성 소스는 project.dependencies 표준에서 지원하지 않는 편집 가능한 설치나 상대 경로와 같은 일반적인 패턴을 지원한다. 예를 들어, 프로젝트 루트를 기준으로 상대 경로에 있는 디렉터리에서 foo를 설치하려면 다음과 같이 설정한다:

pyproject.toml
[project]
name = "example"
version = "0.1.0"
dependencies = ["foo"]

[tool.uv.sources]
foo = { path = "./packages/foo" }

uv에서 지원하는 의존성 소스는 다음과 같다:

  • 인덱스: 특정 패키지 인덱스에서 해결된 패키지.
  • Git: Git 저장소.
  • URL: 원격 wheel 또는 소스 배포판.
  • 경로: 로컬 wheel, 소스 배포판 또는 프로젝트 디렉터리.
  • 워크스페이스: 현재 워크스페이스의 멤버.

중요

소스는 uv에서만 적용된다. 다른 도구를 사용하면 표준 프로젝트 테이블에 정의된 내용만 사용된다. 개발에 다른 도구를 사용하는 경우, 소스 테이블에 제공된 메타데이터는 해당 도구의 형식으로 다시 지정해야 한다.

인덱스

특정 인덱스에서 Python 패키지를 추가하려면 --index 옵션을 사용한다:

$ uv add torch --index pytorch=https://download.pytorch.org/whl/cpu

uv는 인덱스를 [[tool.uv.index]]에 저장하고 [tool.uv.sources] 항목을 추가한다:

pyproject.toml
[project]
dependencies = ["torch"]

[tool.uv.sources]
torch = { index = "pytorch" }

[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"

Tip

위 예제는 PyTorch 인덱스의 특성상 x86-64 Linux에서만 동작한다. PyTorch 설정에 대한 자세한 내용은 PyTorch 가이드를 참고한다.

index 소스를 사용하면 특정 패키지를 해당 인덱스에 고정시킨다. 즉, 다른 인덱스에서 다운로드하지 않는다.

인덱스를 정의할 때 explicit 플래그를 포함하면, tool.uv.sources에서 명시적으로 지정한 패키지에만 해당 인덱스를 사용한다. explicit을 설정하지 않으면, 다른 곳에서 찾을 수 없는 패키지가 해당 인덱스에서 해결될 수 있다.

pyproject.toml
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"
explicit = true

Git

Git 의존성 소스를 추가하려면, git clone에 사용할 수 있는 Git 호환 URL 앞에 git+를 붙인다.

예를 들어:

$ uv add git+https://github.com/encode/httpx
pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx" }

특정 Git 참조를 요청할 수도 있다. 예를 들어, 태그:

$ uv add git+https://github.com/encode/httpx --tag 0.27.0
pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx", tag = "0.27.0" }

또는 브랜치:

$ uv add git+https://github.com/encode/httpx --branch main
pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx", branch = "main" }

또는 리비전(커밋):

$ uv add git+https://github.com/encode/httpx --rev 326b9431c761e1ef1e00b9f760d1f654c8db48c6
pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx", rev = "326b9431c761e1ef1e00b9f760d1f654c8db48c6" }

패키지가 저장소 루트에 있지 않다면 subdirectory를 지정할 수 있다:

$ uv add git+https://github.com/langchain-ai/langchain#subdirectory=libs/langchain
pyproject.toml
[project]
dependencies = ["langchain"]

[tool.uv.sources]
langchain = { git = "https://github.com/langchain-ai/langchain", subdirectory = "libs/langchain" }

URL

URL 소스를 추가하려면 .whl로 끝나는 휠 파일이나 .tar.gz 또는 .zip로 끝나는 소스 배포 파일에 대한 https:// URL을 제공한다. 지원되는 모든 형식은 여기에서 확인할 수 있다.

예를 들어:

$ uv add "https://files.pythonhosted.org/packages/5c/2d/3da5bdf4408b8b2800061c339f240c1802f2e82d55e50bd39c5a881f47f0/httpx-0.27.0.tar.gz"

이 명령은 다음과 같이 pyproject.toml 파일을 생성한다:

pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = { url = "https://files.pythonhosted.org/packages/5c/2d/3da5bdf4408b8b2800061c339f240c1802f2e82d55e50bd39c5a881f47f0/httpx-0.27.0.tar.gz" }

URL 의존성은 pyproject.toml 파일에서 { url = <url> } 구문을 사용해 직접 추가하거나 수정할 수도 있다. 소스 배포 파일이 아카이브 루트에 있지 않은 경우 subdirectory를 지정할 수 있다.

경로

경로 소스를 추가하려면 휠 파일(확장자가 .whl로 끝나는 파일), 소스 배포판(일반적으로 .tar.gz 또는 .zip으로 끝나는 파일; 지원되는 모든 형식은 여기를 참조), 또는 pyproject.toml 파일이 포함된 디렉터리의 경로를 제공한다.

예를 들어:

$ uv add /example/foo-0.1.0-py3-none-any.whl

이 명령은 다음과 같은 pyproject.toml 파일을 생성한다:

pyproject.toml
[project]
dependencies = ["foo"]

[tool.uv.sources]
foo = { path = "/example/foo-0.1.0-py3-none-any.whl" }

경로는 상대 경로일 수도 있다:

$ uv add ./foo-0.1.0-py3-none-any.whl

또는 프로젝트 디렉터리의 경로일 수도 있다:

$ uv add ~/projects/bar/

중요

기본적으로 경로 의존성에 대해 편집 가능한 설치를 사용하지 않는다. 프로젝트 디렉터리에 대해 편집 가능한 설치를 요청할 수 있다:

$ uv add --editable ~/projects/bar/

동일한 저장소에 여러 패키지가 있는 경우, 워크스페이스가 더 적합할 수 있다.

워크스페이스 멤버

워크스페이스 멤버에 대한 의존성을 선언하려면 멤버 이름에 { workspace = true }를 추가한다. 모든 워크스페이스 멤버는 명시적으로 선언해야 한다. 워크스페이스 멤버는 항상 편집 가능 상태다. 워크스페이스에 대한 자세한 내용은 워크스페이스 문서를 참고한다.

pyproject.toml
[project]
dependencies = ["foo==0.1.0"]

[tool.uv.sources]
foo = { workspace = true }

[tool.uv.workspace]
members = [
  "packages/foo"
]

플랫폼별 소스 설정

특정 플랫폼이나 Python 버전에 한정된 소스를 사용하려면, 의존성 명세와 호환되는 환경 마커를 소스에 제공하면 된다.

예를 들어, httpx를 GitHub에서 가져오되 macOS에서만 사용하려면 다음과 같이 설정한다:

pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx", tag = "0.27.2", marker = "sys_platform == 'darwin'" }

소스에 마커를 지정하면, uv는 모든 플랫폼에서 httpx를 포함하지만, macOS에서는 GitHub에서 소스를 다운로드하고, 다른 플랫폼에서는 PyPI를 사용한다.

여러 소스 지정

단일 의존성에 대해 여러 소스를 지정할 수 있다. 이때 PEP 508과 호환되는 환경 마커를 사용해 소스를 구분한다.

예를 들어, macOS와 Linux에서 각기 다른 httpx 태그를 가져오려면 다음과 같이 설정한다:

pyproject.toml
[project]
dependencies = ["httpx"]

[tool.uv.sources]
httpx = [
  { git = "https://github.com/encode/httpx", tag = "0.27.2", marker = "sys_platform == 'darwin'" },
  { git = "https://github.com/encode/httpx", tag = "0.24.1", marker = "sys_platform == 'linux'" },
]

이 전략은 환경 마커를 기반으로 다른 인덱스를 사용하는 경우에도 적용된다. 예를 들어, 플랫폼에 따라 다른 PyTorch 인덱스에서 torch를 설치하려면 다음과 같이 설정한다:

pyproject.toml
[project]
dependencies = ["torch"]

[tool.uv.sources]
torch = [
  { index = "torch-cpu", marker = "platform_system == 'Darwin'"},
  { index = "torch-gpu", marker = "platform_system == 'Linux'"},
]

[[tool.uv.index]]
name = "torch-cpu"
url = "https://download.pytorch.org/whl/cpu"

[[tool.uv.index]]
name = "torch-gpu"
url = "https://download.pytorch.org/whl/cu124"

소스 비활성화

uv가 tool.uv.sources 테이블을 무시하도록 하려면 (예: 패키지의 공개된 메타데이터로 해결하는 상황을 시뮬레이션할 때), --no-sources 플래그를 사용한다:

$ uv lock --no-sources

--no-sources를 사용하면 uv가 특정 의존성을 충족시킬 수 있는 워크스페이스 멤버를 발견하지 못하게 된다.

선택적 의존성

라이브러리로 배포되는 프로젝트에서는 기본 의존성 트리를 줄이기 위해 일부 기능을 선택적으로 제공하는 것이 일반적이다. 예를 들어, Pandas는 excel 추가 기능plot 추가 기능을 제공한다. 이를 통해 사용자가 명시적으로 요청하지 않는 한 Excel 파서나 matplotlib가 설치되지 않는다. 추가 기능은 package[<extra>] 구문으로 요청할 수 있다. 예를 들어 pandas[plot, excel]과 같이 사용한다.

선택적 의존성은 [project.optional-dependencies]에 지정한다. 이 TOML 테이블은 추가 기능 이름을 해당 의존성에 매핑하며, 의존성 지정자 구문을 따른다.

선택적 의존성도 일반 의존성과 마찬가지로 tool.uv.sources에 항목을 추가할 수 있다.

pyproject.toml
[project]
name = "pandas"
version = "1.0.0"

[project.optional-dependencies]
plot = [
  "matplotlib>=3.6.3"
]
excel = [
  "odfpy>=1.4.1",
  "openpyxl>=3.1.0",
  "python-calamine>=0.1.7",
  "pyxlsb>=1.0.10",
  "xlrd>=2.0.1",
  "xlsxwriter>=3.0.5"
]

선택적 의존성을 추가하려면 --optional <extra> 옵션을 사용한다:

$ uv add httpx --optional network

Note

선택적 의존성이 서로 충돌하는 경우, 명시적으로 충돌하는 의존성으로 선언하지 않으면 해결에 실패한다.

특정 선택적 의존성에만 적용되는 소스를 선언할 수도 있다. 예를 들어, 선택적 cpu 또는 gpu 추가 기능에 따라 다른 PyTorch 인덱스에서 torch를 가져오는 경우:

pyproject.toml
[project]
dependencies = []

[project.optional-dependencies]
cpu = [
  "torch",
]
gpu = [
  "torch",
]

[tool.uv.sources]
torch = [
  { index = "torch-cpu", extra = "cpu" },
  { index = "torch-gpu", extra = "gpu" },
]

[[tool.uv.index]]
name = "torch-cpu"
url = "https://download.pytorch.org/whl/cpu"

[[tool.uv.index]]
name = "torch-gpu"
url = "https://download.pytorch.org/whl/cu124"

개발 의존성

선택적 의존성과 달리, 개발 의존성은 로컬에서만 사용되며 PyPI나 다른 인덱스에 프로젝트를 게시할 때 요구 사항에 포함되지 않는다. 따라서 개발 의존성은 [project] 테이블에 포함되지 않는다.

개발 의존성도 일반 의존성과 마찬가지로 tool.uv.sources에 항목을 추가할 수 있다.

개발 의존성을 추가하려면 --dev 플래그를 사용한다:

$ uv add --dev pytest

uv는 PEP 735에 정의된 대로 [dependency-groups] 테이블을 사용해 개발 의존성을 선언한다. 위 명령어는 dev 그룹을 생성한다:

pyproject.toml
[dependency-groups]
dev = [
  "pytest >=8.1.1,<9"
]

dev 그룹은 특별히 취급된다. 이 그룹의 의존성을 포함하거나 제외하려면 --dev, --only-dev, --no-dev 플래그를 사용한다. 모든 기본 그룹을 비활성화하려면 --no-default-groups를 참고한다. 또한 dev 그룹은 기본적으로 동기화된다.

의존성 그룹

개발 의존성을 --group 플래그를 사용해 여러 그룹으로 나눌 수 있다.

예를 들어 lint 그룹에 개발 의존성을 추가하려면 다음과 같이 입력한다:

$ uv add --group lint ruff

이 명령어는 pyproject.toml 파일에 다음과 같은 [dependency-groups] 정의를 추가한다:

pyproject.toml
[dependency-groups]
dev = [
  "pytest"
]
lint = [
  "ruff"
]

그룹을 정의한 후에는 --all-groups, --no-default-groups, --group, --only-group, 그리고 --no-group 옵션을 사용해 해당 의존성을 포함하거나 제외할 수 있다.

Tip

--dev, --only-dev, --no-dev 플래그는 각각 --group dev, --only-group dev, --no-group dev와 동일하다.

uv는 모든 의존성 그룹이 서로 호환되도록 요구하며, lockfile을 생성할 때 모든 그룹을 함께 해결한다.

한 그룹에 선언된 의존성이 다른 그룹과 호환되지 않으면, uv는 프로젝트의 요구 사항을 해결하지 못하고 오류를 발생시킨다.

Note

서로 충돌하는 의존성 그룹이 있다면, 명시적으로 충돌하는 의존성으로 선언하지 않는 한 해결에 실패한다.

기본 그룹 설정

기본적으로 uv는 환경에서 dev 의존성 그룹을 포함한다(예: uv run 또는 uv sync 실행 시). 포함할 기본 그룹은 tool.uv.default-groups 설정을 통해 변경할 수 있다.

pyproject.toml
[tool.uv]
default-groups = ["dev", "foo"]

Tip

uv run 또는 uv sync 실행 시 이 동작을 비활성화하려면 --no-default-groups를 사용한다. 특정 기본 그룹을 제외하려면 --no-group <name>을 사용한다.

레거시 dev-dependencies

[dependency-groups]가 표준화되기 전에는 uv가 tool.uv.dev-dependencies 필드를 사용해 개발 의존성을 지정했다. 예를 들면 다음과 같다:

pyproject.toml
[tool.uv]
dev-dependencies = [
  "pytest"
]

이 섹션에 선언된 의존성은 dependency-groups.dev의 내용과 결합된다. 결국 dev-dependencies 필드는 더 이상 사용되지 않고 제거될 예정이다.

Note

tool.uv.dev-dependencies 필드가 존재하면, uv add --dev는 새로운 dependency-groups.dev 섹션을 추가하는 대신 기존 섹션을 사용한다.

빌드 의존성

프로젝트가 파이썬 패키지로 구성된 경우, 프로젝트를 빌드하는 데 필요하지만 실행에는 필요하지 않은 의존성을 선언할 수 있다. 이러한 의존성은 PEP 518에 따라 [build-system] 테이블의 build-system.requires 아래에 지정된다.

예를 들어, 프로젝트가 setuptools를 빌드 백엔드로 사용한다면, setuptools를 빌드 의존성으로 선언해야 한다:

pyproject.toml
[project]
name = "pandas"
version = "0.1.0"

[build-system]
requires = ["setuptools>=42"]
build-backend = "setuptools.build_meta"

기본적으로 uv는 빌드 의존성을 해결할 때 tool.uv.sources를 존중한다. 예를 들어, 빌드에 setuptools의 로컬 버전을 사용하려면 tool.uv.sources에 소스를 추가한다:

pyproject.toml
[project]
name = "pandas"
version = "0.1.0"

[build-system]
requires = ["setuptools>=42"]
build-backend = "setuptools.build_meta"

[tool.uv.sources]
setuptools = { path = "./packages/setuptools" }

패키지를 배포할 때는 uv build --no-sources를 실행하여 tool.uv.sources가 비활성화된 상태에서도 패키지가 올바르게 빌드되는지 확인하는 것을 권장한다. 이는 pypa/build와 같은 다른 빌드 도구를 사용할 때와 동일한 상황이다.

편집 가능한 의존성

일반적으로 Python 패키지가 포함된 디렉토리를 설치할 때, 먼저 wheel을 빌드한 다음 해당 wheel을 가상 환경에 설치한다. 이때 모든 소스 파일이 복사된다. 패키지 소스 파일을 수정하면, 가상 환경에는 이전 버전의 파일이 남아 있게 된다.

편집 가능한 설치 방식은 이 문제를 해결한다. 가상 환경 내에 프로젝트에 대한 링크(.pth 파일)를 추가하여 인터프리터가 소스 파일을 직접 포함하도록 지시한다.

편집 가능한 설치에는 몇 가지 제한이 있다(주로: 빌드 백엔드가 이를 지원해야 하며, 네이티브 모듈은 임포트 전에 재컴파일되지 않음). 하지만 개발 과정에서 유용하게 사용할 수 있다. 가상 환경이 항상 패키지의 최신 변경 사항을 반영하기 때문이다.

uv는 기본적으로 워크스페이스 패키지에 대해 편집 가능한 설치를 사용한다.

편집 가능한 의존성을 추가하려면 --editable 플래그를 사용한다:

$ uv add --editable ./path/foo

또는 워크스페이스에서 편집 가능한 의존성을 사용하지 않으려면 다음과 같이 입력한다:

$ uv add --no-editable ./path/foo

의존성 명세 (PEP 508)

uv는 의존성 명세를 사용하며, 이는 이전에 PEP 508로 알려진 방식이다. 의존성 명세는 다음과 같은 순서로 구성된다:

  • 의존성 이름
  • 필요한 추가 기능 (선택 사항)
  • 버전 명세
  • 환경 마커 (선택 사항)

버전 명세는 쉼표로 구분되어 함께 추가된다. 예를 들어, foo >=1.2.3,<2,!=1.4.0는 "1.2.3 이상이지만 2 미만이고, 1.4.0이 아닌 foo 버전"으로 해석된다.

필요한 경우 명세는 후행 0으로 채워진다. 따라서 foo ==2는 foo 2.0.0과도 일치한다.

등호와 함께 별표를 마지막 자리에 사용할 수 있다. 예를 들어, foo ==2.1.*은 2.1 시리즈의 모든 릴리스를 허용한다. 마찬가지로, ~=는 마지막 자리가 같거나 높은 경우를 일치시킨다. 예를 들어, foo ~=1.2foo >=1.2,<2와 같고, foo ~=1.2.3foo >=1.2.3,<1.3과 같다.

추가 기능은 이름과 버전 사이의 대괄호 안에 쉼표로 구분되어 표기된다. 예를 들어, pandas[excel,plot] ==2.2와 같다. 추가 기능 이름 사이의 공백은 무시된다.

일부 의존성은 특정 환경에서만 필요하다. 예를 들어, 특정 Python 버전이나 운영체제가 있다. importlib.metadata 모듈을 위한 importlib-metadata 백포트를 설치하려면 importlib-metadata >=7.1.0,<8; python_version < '3.10'를 사용한다. Windows에서 colorama를 설치하려면 colorama >=0.4.6,<5; platform_system == "Windows"를 사용한다.

마커는 and, or, 그리고 괄호로 결합된다. 예를 들어, aiohttp >=3.7.4,<4; (sys_platform != 'win32' or implementation_name != 'pypy') and python_version >= '3.10'와 같다. 마커 내의 버전은 따옴표로 묶어야 하지만, 마커 외부의 버전은 따옴표로 묶지 않아야 한다.