uv run -m src.db.csv_to_snowpg --옵션... 같은 긴 명령어를 uv run csv-to-snowpg처럼 짧게 만들 수 있다
핵심은 [project.scripts]에 “이 이름을 부르면 이 함수를 실행해”라는 단축키를 등록하는 것이다
단축키가 동작하려면 [build-system]이 있어야 한다. 그래야 uv가 내 프로젝트를 패키지로 포장해 .venv에 설치한다
uv_build의 module-root 기본값이 src라서 설정에도, import에도 src.를 쓰지 않는다
파라미터는 코드 안의 기본값과 .env로 옮겨서 줄인다
들어가며
uv 프로젝트 관리에서 pyproject.toml을 “설계도”라고 정리했다. 이 설계도에는 필요한 재료(dependencies)만 적는 게 아니라 실행 버튼도 적을 수 있다.
예를 들어 터미널에서 Python 모듈을 실행할 때마다 src.package.module --param value처럼 모듈 경로 전체와 인자를 입력해 왔다고 하자. pyproject.toml에 entry point를 등록하면 이 입력을 짧은 명령어 하나로 줄일 수 있다.
이 글은 명령어 단축에 필요한 TOML 파일의 구성과 설정 방법, 그리고 단축이 동작하는 원리를 다룬다.
명령어 단축 전후 비교
# AS-ISuv run -m src.package.module --param1 value1 --param2 value2# TO-BEuv run module
[project]는 프로젝트의 기본 정보를 담고 있으며, [project.scripts]를 통해 단축키를 등록할 수 있다.
[project]에 들어가는 선언값은 다음과 같다.
명칭
기능
name
프로젝트 이름
version
프로젝트 버전. 업데이트 명령어를 실행할 때 이 값을 가져올 수 있다
description
프로젝트에 대한 설명글
readme
프로젝트 개요에 대한 파일명. 대표적으로 README.md
requires-python
요구하는 Python 버전
dependencies
코드 실행에 필요한 패키지와 최소 버전. 패키지 간 종속성 충돌을 막는다
project.scripts는 단축키를 등록하기 위한 설정이다. 아래 예시는 “csv-to-snowpg라고 부르면 src/DataUpload/csv_to_snowpg.py의 main()을 실행해”라는 뜻이다. 이 설정이 없으면 예전과 같이 -m src.DataUpload.csv_to_snowpg처럼 긴 경로를 매번 입력해야 한다.
project.scripts 항목 읽는 법
csv_to_snowpg = "DataUpload.csv_to_snowpg : main" ↑ 부를 이름 ↑ 어느 파일에서 ↑ 어떤 함수를 실행할지
uv sync를 하면 운영체제에 맞는 실행 파일이 생긴다. Windows는 .venv/Scripts/csv-to-snowpg.exe, macOS·Linux는 .venv/bin/csv-to-snowpg이다.
build-system
[build-system]은 프로젝트를 패키지로 빌드할 담당자를 지정하는 칸이다.
uv sync를 하면 uv는 내 프로젝트 자체를 하나의 패키지로 말아서 .venv에 넣는다. pandas, numpy 같은 패키지를 설치할 때와 같은 방식이며, 이 작업을 빌드(build)라고 한다.
build-backend 는 이 프로젝트를 누가 빌드할지, 즉 빌드 담당자를 지정하는 값이다. Python의 빌드 담당자(빌드 도구)에는 setuptools, hatchling, poetry-core 등이 있으며, uv 팀이 만든 uv_build가 대표적이다. 이 글은 uv_build를 다룬다.
requires 는 빌드를 수행하기 전에 설치할 빌드 담당자와 그 버전 조건이다. 쉽게 말해 빌드 전에 uv_build0.11.3 이상, 0.12 미만을 먼저 설치해라는 뜻이다. <0.12로 상한을 둔 이유는 uv_build에 큰 업데이트가 나와도 패키징 방식이 바뀌지 않게 하기 위해서다.