Giting.
낮의 Giting

홈 · python · rust · package-manager · devtools

uv 대표 이미지 MIT OR Apache-2.0 이중 (검수 확인: LICENSE-MIT·LICENSE-APACHE 병존, GitHub SPDX 는 Apache-2.0 만 표시)
MAGAZINE VOL.2이 리포는 매거진 특집으로도 깊게 다뤘습니다: 모델이 나와도, 코드는 흔들리지 않았다 →
분석 리포트실측 정보사이트적용점원문 README

구조와 기능

uv는 Astral이 만든 파이썬 패키지·프로젝트 관리 도구다. 실측 기준 전체 텍스트 689,797줄 가운데 Rust가 516,257줄(630개 파일)로 75%를 차지하고, 반대로 Python 파일은 104개 10,594줄로 전체의 1.5% 수준에 그친다. 이 비중만 봐도 핵심 리졸버·설치 로직이 파이썬이 아니라 러스트로 구현돼 있고, 남은 파이썬 코드는 테스트 시나리오나 보조 스크립트 성격에 가깝다는 것을 짐작할 수 있다.

테스트에 들인 무게가 특히 눈에 띈다. 전체 1,721개 파일 중 661개(약 38%)가 테스트 파일이고, 스냅샷(.snap) 파일만 88개에 81,750줄이다. 그중 crates/uv/tests/lock/lock.rs 한 파일이 39,934줄로 저장소 전체에서 가장 큰 파일이다. 의존성 잠금(lock) 처리 하나를 검증하는 데 이 정도 분량의 테스트가 붙어 있다는 것은, 이 기능이 uv 안에서 얼마나 정교하게 다뤄지는(혹은 다뤄져야 하는) 영역인지를 보여주는 실측 근거다.

CI 워크플로우는 42개로, toml 설정 파일도 376개 17,414줄에 달한다. pyproject 기준 파이썬 의존성은 20개로 확인됐지만, cargo 쪽 의존성 카운트는 0으로 잡혔다. 이는 630개 rs 파일 규모를 감안하면 실제로 Rust 의존성이 없다는 뜻이라기보다, 워크스페이스 내 중첩 Cargo.toml까지 스캐너가 도달하지 못한 계측 한계로 보는 편이 맞다. 그 밖에 루트 문서와 SKILL.md 형태의 에이전트용 문서(agentPackaging.skillMd)가 갖춰져 있다는 점도 실측에서 확인됐다.

하이라이트

락 처리 테스트의 규모. crates/uv/tests/lock/lock.rs가 39,934줄로 저장소 최대 파일이라는 사실 자체가, 의존성 해석·잠금이라는 기능이 이 프로젝트에서 얼마나 많은 엣지케이스를 안고 있는지를 대변한다. 스냅샷 테스트(.snap) 88개 81,750줄과 합쳐 보면, CLI 동작 하나하나를 스냅샷으로 고정해 회귀를 막는 전략을 코드 규모로 뒷받침하고 있다.

이슈 대응 속도. 샘플 25건 중 20건이 응답을 받았고 중앙값 0.7시간(약 42분)이라는 수치는, 이 규모(89,500 스타, 오픈 이슈 2,878건)의 프로젝트치고 이례적으로 빠른 초기 트리아지 속도다. 다만 이 수치는 "첫 응답까지"의 속도이지 "해결까지"의 속도가 아니라는 점은 구분해서 봐야 한다.

커밋 통계의 절반은 사람이 아니다. 상위 기여자 5명 중 astral-automations-bot[bot]과 renovate[bot], 그리고 계정명으로 미루어 봇으로 추정되는 zaniebot까지 포함되면 최대 3개가 자동화 계정이고, 사람 이름은 Charlie Marsh와 Zanie Blue 둘만 실측 상위 목록에 남는다. 저자 수 50명, 최근 90일 커밋 1,000건(shallow clone depth 1000 기준 하한값)이라는 velocity 지표를 읽을 때, 의존성 업데이트나 문서/스키마 자동 생성 같은 봇 커밋이 상당 부분을 차지한다는 점을 감안해야 한다.

주의점

라이선스는 검수 과정에서 저장소를 직접 확인한 결과 MIT와 Apache-2.0 이중 라이선스다(LICENSE-MIT·LICENSE-APACHE 병존, 사용자가 택일). GitHub SPDX 표시는 Apache-2.0 하나만 잡히므로 자동 분류만 믿으면 절반만 보는 셈이다. 어느 쪽이든 permissive 라 상업적 사용에 제약은 없지만, cargo 의존성 카운트가 0으로 잡힌 부분은 실제 무의존성을 뜻하는 게 아니라 계측 한계일 가능성이 커서, 서드파티 Rust crate 의존성 리스크는 이 실측만으로 판단하지 말고 별도로 확인해야 한다.

오픈 이슈 2,878건은 적지 않은 백로그다. 이슈 응답 중앙값 0.7시간이라는 빠른 트리아지와 대조적으로, 실제 종결·해결 속도에 대한 실측치는 없다. 또한 1,000건 이상(하한값)의 커밋이 약 85일(2026-06-12~2026-09-05) 사이에 몰려 있는 만큼 변경 속도가 빠른 편이라, 프로덕션 빌드 파이프라인에 도입한다면 uv.lock과 버전 고정을 통해 예기치 않은 동작 변화에 대비하는 편이 안전하다.

실측 정보

라이선스
MIT OR Apache-2.0 이중 (검수 확인: LICENSE-MIT·LICENSE-APACHE 병존, GitHub SPDX 는 Apache-2.0 만 표시)
스타 / 포크
89,500 / 3,544
오픈 이슈
2,878건
이슈 응답 (샘플 25건 중 20건, 중앙값)
0.7시간
최근 90일 커밋 (shallow depth 1000, 하한값)
1,000건
저자 수 / 원격 태그
50명 / 308개
코드 구성
Rust 516,257줄(630파일) · 스냅샷 테스트 81,750줄(88파일) · 전체 텍스트 689,797줄

사이트 실측

주소
docs.astral.sh/uv
응답 · 첫 화면
200 · 1.9초 (데스크톱)
요청 · 전송량
33개 · 443KB
깨진 요청 · 콘솔 오류
0개 · 0개
폰(390px)
가로 넘침 없음
디자인
밝은 화면 · Roboto

홈페이지를 실제 크롬으로 띄워 첫 화면까지만 쟀습니다(2026-10-16 · 데스크톱 1440px · 폰 390px). 로그인 · 입력 같은 동작은 하지 않았고, 사이트 상태는 리포 품질과 따로 봅니다. 색 칸은 바탕 · 면 · 글자 · 흐린 글자 · 강조 · 선, 점선은 「못 잼」.

적용점

  • P0 · 비용 낮음pip/pip-tools/venv 대체로 국소 도입(로컬 개발 환경, CI 캐시)부터 시작해 락파일 재현성을 검증한다.
  • P1 · 비용 중간오픈 이슈 2,878건 중 자사 워크로드와 겹치는 이슈(플랫폼, 락파일 엣지케이스)를 사전에 검색해 회귀 리스크를 가늠한다.
  • P2 · 비용 높음1,000+커밋/약 85일이라는 변경 속도를 감안해, 프로덕션 파이프라인에 버전을 고정(pin)하고 업그레이드 주기를 별도로 관리한다.
◆ 도입 후보

89,500 스타에 걸맞은 실측 근거가 뒷받침된다. 이슈 25건 샘플 중 20건이 응답을 받았고 중앙값 0.7시간이라는 대응 속도, 42개 CI 워크플로우, 전체 파일의 38%(661개)에 달하는 테스트 비중, 그리고 락파일 처리 하나에만 39,934줄짜리 테스트 파일을 붙여둔 점은 도입 후보로 판단할 근거가 된다. 다만 오픈 이슈 2,878건이라는 백로그와, 상위 커밋 저자 5명 중 2~3명이 자동화 봇 계정이라는 점은 velocity 지표를 그대로 신뢰하기보다 실제 릴리즈 노트·이슈 종결 추이를 직접 확인하고 도입할 것을 권한다.

원문 README

아래는 astral-sh/uv 저장소의 README 원문입니다(GitHub 렌더, 수집 시점 기준). 저작권은 원 프로젝트에 있으며 원 저장소의 라이선스를 따릅니다. GitHub에서 보기

README 전문 펼치기

uv

Latest PyPI version Supported Python versions Discord

An extremely fast Python package and project manager, written in Rust.

Shows a bar chart with benchmark results.

Installing Trio's dependencies with a warm cache.

Highlights

uv is backed by Astral, the creators of Ruff and ty.

Installation

Install uv with our standalone installers:

# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
# On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Or, from PyPI:

# With pip.
pip install uv
# Or pipx.
pipx install uv

If installed via the standalone installer, uv can update itself to the latest version:

uv self update

See the installation documentation for details and alternative installation methods.

Documentation

uv's documentation is available at docs.astral.sh/uv.

Additionally, the command line reference documentation can be viewed with uv help.

Features

Projects

uv manages project dependencies and environments, with support for lockfiles, workspaces, and more, similar to rye or poetry:

$ uv init example
Initialized project `example` at `/home/user/example`

$ cd example

$ uv add ruff
Creating virtual environment at: .venv
Resolved 2 packages in 170ms
   Built example @ file:///home/user/example
Prepared 2 packages in 627ms
Installed 2 packages in 1ms
 + example==0.1.0 (from file:///home/user/example)
 + ruff==0.5.0

$ uv run ruff check
All checks passed!

$ uv lock
Resolved 2 packages in 0.33ms

$ uv sync
Resolved 2 packages in 0.70ms
Checked 1 package in 0.02ms

See the project documentation to get started.

uv also supports building and publishing projects, even if they're not managed with uv. See the publish guide to learn more.

Scripts

uv manages dependencies and environments for single-file scripts.

Create a new script and add inline metadata declaring its dependencies:

$ echo 'import requests; print(requests.get("https://astral.sh"))' > example.py

$ uv add --script example.py requests
Updated `example.py`

Then, run the script in an isolated virtual environment:

$ uv run example.py
Reading inline script metadata from: example.py
Installed 5 packages in 12ms
<Response [200]>

See the scripts documentation to get started.

Tools

uv executes and installs command-line tools provided by Python packages, similar to pipx.

Run a tool in an ephemeral environment using uvx (an alias for uv tool run):

$ uvx pycowsay 'hello world!'
Resolved 1 package in 167ms
Installed 1 package in 9ms
 + pycowsay==0.0.0.2
  """

  ------------
< hello world! >
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

Install a tool with uv tool install:

$ uv tool install ruff
Resolved 1 package in 6ms
Installed 1 package in 2ms
 + ruff==0.5.0
Installed 1 executable: ruff

$ ruff --version
ruff 0.5.0

See the tools documentation to get started.

Python versions

uv installs Python and allows quickly switching between versions.

Install multiple Python versions:

$ uv python install 3.12 3.13 3.14
Installed 3 versions in 972ms
 + cpython-3.12.12-macos-aarch64-none (python3.12)
 + cpython-3.13.9-macos-aarch64-none (python3.13)
 + cpython-3.14.0-macos-aarch64-none (python3.14)

Download Python versions as needed:

$ uv venv --python 3.12.0
Using Python 3.12.0
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

$ uv run --python pypy@3.8 -- python --version
Python 3.8.16 (a9dbdca6fc3286b0addd2240f11d97d8e8de187a, Dec 29 2022, 11:45:30)
[PyPy 7.3.11 with GCC Apple LLVM 13.1.6 (clang-1316.0.21.2.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>

Use a specific Python version in the current directory:

$ uv python pin 3.11
Pinned `.python-version` to `3.11`

See the Python installation documentation to get started.

The pip interface

uv provides a drop-in replacement for common pip, pip-tools, and virtualenv commands.

uv extends their interfaces with advanced features, such as dependency version overrides, platform-independent resolutions, reproducible resolutions, alternative resolution strategies, and more.

Migrate to uv without changing your existing workflows — and experience a 10-100x speedup — with the uv pip interface.

Compile requirements into a platform-independent requirements file:

$ uv pip compile requirements.in \
   --universal \
   --output-file requirements.txt
Resolved 43 packages in 12ms

Create a virtual environment:

$ uv venv
Using Python 3.12.3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

Install the locked requirements:

$ uv pip sync requirements.txt
Resolved 43 packages in 11ms
Installed 43 packages in 208ms
 + babel==2.15.0
 + black==24.4.2
 + certifi==2024.7.4
 ...

See the pip interface documentation to get started.

Contributing

We are passionate about supporting contributors of all levels of experience and would love to see you get involved in the project. See the contributing guide to get started.

FAQ

How do you pronounce uv?

It's pronounced as "you - vee" (/juː viː/)

How should I stylize uv?

Just "uv", please. See the style guide for details.

What platforms does uv support?

See uv's platform support document.

Is uv ready for production?

Yes, uv is stable and widely used in production. See uv's versioning policy document for details.

Acknowledgements

uv's dependency resolver uses PubGrub under the hood. We're grateful to the PubGrub maintainers, especially Jacob Finkelman, for their support.

uv's Git implementation is based on Cargo.

Some of uv's optimizations are inspired by the great work we've seen in pnpm, Orogene, and Bun. We've also learned a lot from Nathaniel J. Smith's Posy and adapted its trampoline for Windows support.

License

uv is licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in uv by you, as defined in the Apache-2.0 license, shall be dually licensed as above, without any additional terms or conditions.

의견

판정에 대한 반론, 도입 경험, 정정 제보를 환영합니다. GitHub 계정으로 참여합니다.

이것도 재봤습니다

전체 리포트 →