파이썬 프로젝트의 Makefiles 사례 (및 시작 방법)


틀 소개
사진 : Python Project에서 작업하고 있으며 테스트를 실행할 때마다 입력합니다. python3 -m pytest tests/ --verbose --cov=src
. 코드를 형식화하려면입니다 black . && isort .
. 줄무늬를 위해 실행됩니다 flake8 src tests
. 당신이 그것을 알기 전에, 당신은 12 개의 다른 명령을 저글링하고 있으며, 당신의 팀원들은 약간 다른 일을하고 있습니다.
이것은 Makefiles가 유용한 곳입니다. 원래 C 및 C ++ 프로젝트에 사용되는 MakeFiles는 일반적인 작업을 표준화하고 자동화하는 간단한 방법으로 파이썬 개발에 매우 유용 할 수 있습니다. Makefile을 반복적으로하는 모든 일에 대한 지름길을 정의하는 단일 장소로 생각하십시오.
틀 파이썬 프로젝트에서 Makefiles를 사용하는 이유는 무엇입니까?
팀 전체의 일관성
팀의 모든 사람이 달릴 때 make test
모든 플래그가있는 정확한 Pytest 명령을 기억하는 대신 “내 컴퓨터의 작품”문제를 제거합니다. 새로운 팀원은 테스트, 포맷 코드 또는 응용 프로그램을 실행하는 방법을 즉시 알 수 있습니다.
실제로 작동하는 문서
구식이되는 readme 파일과 달리 MakeFiles는 유용한 문서로 사용됩니다. 누군가가 달릴 때 make help
그들은 어떤 작업을 사용할 수 있고 사용하는 방법을 정확히 알 수 있습니다.
단순화 된 복잡한 워크 플로
일부 작업에는 여러 단계가 필요합니다. 종속성을 설치하고 마이그레이션을 실행하고 시드 테스트 데이터를 시작한 다음 개발 서버를 시작해야 할 수도 있습니다. Makefile을 사용하면 단일이됩니다 make dev
명령.
틀 첫 번째 파이썬 MakeFile을 시작합니다
실용적인 Makefile을 단계별로 구축합시다. 프로젝트 루트에서 makefile (확장 없음)이라는 파일을 만듭니다.
// 기본 구조 및 도움말 명령
이 코드는 설명과 함께 사용 가능한 모든 명령을 표시하는 MakeFile에 대한 자동 도움말 시스템을 만듭니다.
.PHONY: help
help: ## Show this help message
@echo "Available commands:"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
.DEFAULT_GOAL := help
그만큼 .PHONY: help
“도움말”이 실제 파일이 아니라 실행하라는 명령이라고 말합니다. 입력 할 때 make help
첫 번째 인쇄 “사용 가능한 명령 :”그런 다음 “조합을 사용합니다. grep
그리고 awk
Makefile 자체를 스캔하려면 명령 이름과 다음으로 표시되는 모든 줄을 찾으십시오. ## description
명령 이름과 설명으로 읽을 수있는 목록으로 포맷하십시오.
// 환경 설정
이 코드는 세 가지 환경 관리 명령을 만듭니다.
.PHONY: install
install: ## Install dependencies
pip install -r requirements.txt
pip install -r requirements-dev.txt
.PHONY: venv
venv: ## Create virtual environment
python3 -m venv venv
@echo "Activate with: source venv/bin/activate"
.PHONY: clean
clean: ## Clean up cache files and build artifacts
find . -type f -name "*.pyc" -delete
find . -type d -name "__pycache__" -delete
find . -type d -name "*.egg-info" -exec rm -rf {} +
rm -rf build/ dist/ .coverage htmlcov/ .pytest_cache/
그만큼 install
명령은 PIP를 두 번 실행하여 요구 사항 파일에서 주요 종속성 및 개발 도구를 모두 설치합니다. Venv 명령은 “Venv”라는 새로운 Python 가상 환경 폴더를 생성하고 활성화하는 방법에 대한 지침을 인쇄합니다.
그만큼 clean
명령은 Python이 개발 중에 생성하는 모든 지저분한 파일을 제거합니다. 컴파일 된 Python 파일 (.pyc), 캐시 폴더를 삭제합니다.pycache), 패키지 정보 디렉토리 및 커버리지 보고서 및 테스트 캐시와 같은 아티팩트를 구축합니다.
// 코드 품질 및 테스트
코드 품질 명령을 만듭니다.
.PHONY: format
format: ## Format code with black and isort
black .
isort .
.PHONY: lint
lint: ## Run linting checks
flake8 src tests
black --check .
isort --check-only .
.PHONY: test
test: ## Run tests
python -m pytest tests/ --verbose
.PHONY: test-cov
test-cov: ## Run tests with coverage
python -m pytest tests/ --verbose --cov=src --cov-report=html --cov-report=term
.PHONY: check
check: lint test ## Run all checks (lint + test)
그만큼 format
명령은 포맷을 위해 Black을 사용하여 코드 스타일을 자동으로 수정하고 가져 오기 조직을위한 ISORT를 자동으로 수정합니다.
Lint 명령은 코드가 아무것도 변경하지 않고 스타일 규칙을 따르는 지 확인합니다. Flake8은 스타일 위반을 발견하고 검은 색과 ISORT는 체크 전용 모드에서 실행되어 형식이 필요한지 확인합니다.
그만큼 test
명령은 테스트 스위트를 실행합니다. test-cov
테스트를 실행하고 코드 범위를 측정하고 보고서를 생성합니다. 그만큼 check
명령은 lint
그리고 test
명령.
// 개발 워크 플로
이것은 개발 워크 플로 명령을 만듭니다.
.PHONY: dev
dev: install ## Set up development environment
@echo "Development environment ready!"
@echo "Run 'make serve' to start the development server"
.PHONY: serve
serve: ## Start development server
python3 -m flask run --debug
.PHONY: shell
shell: ## Start Python shell with app context
python3 -c "from src.app import create_app; app=create_app(); app.app_context().push(); import IPython; IPython.start_ipython()"
그만큼 dev
명령은 먼저 install
의존성을 설정하려면 명령 다음 다음 단계로 성공 메시지를 인쇄합니다. 그만큼 serve
명령은 디버그 모드에서 플라스크 개발 서버를 시작합니다.
그만큼 shell
명령은 이미 플라스크 앱 컨텍스트에 이미 연결된 ipython 쉘을 시작하므로 모든 것을 수동으로 가져 오지 않고도 데이터베이스 쿼리 및 앱 기능을 대화식으로 테스트 할 수 있습니다.
틀 더 많은 Makefile 기술
// 변수 사용
반복을 피하기 위해 변수를 정의 할 수 있습니다.
PYTHON := python3
TEST_PATH := tests/
SRC_PATH := src/
.PHONY: test
test: ## Run tests
$(PYTHON) -m pytest $(TEST_PATH) --verbose
// 조건부 명령
때로는 환경에 따라 다른 행동을 원합니다.
.PHONY: deploy
deploy: ## Deploy application
ifeq ($(ENV),production)
@echo "Deploying to production..."
# Production deployment commands
else
@echo "Deploying to staging..."
# Staging deployment commands
endif
// 파일 종속성
대상이 파일에 의존 할 수 있으므로 필요할 때만 실행할 수 있습니다.
requirements.txt: pyproject.toml
pip-compile pyproject.toml
.PHONY: sync-deps
sync-deps: requirements.txt ## Sync dependencies
pip-sync requirements.txt
🔗 다음은 플라스크 웹 애플리케이션을위한 완전한 Makefile의 예입니다..
틀 모범 사례 및 팁
MakeFiles를 쓸 때 따라야 할 모범 사례는 다음과 같습니다.
- Makefile을 과도하게 복제하지 마십시오. 작업이 복잡해지면 논리를 별도의 스크립트로 옮기고 Make에서 호출하십시오.
- 그들이하는 일을 명확하게 나타내는 명령 이름을 선택하십시오. 테스트를 만드는 것보다 테스트를 더 좋게 만들고 Dev-Setup을 설정하는 것보다 명확하게 만드십시오.
- 파일을 생성하지 않는 명령의 경우 항상 .phony로 선언하십시오. 누군가가 귀하의 명령과 동일한 이름의 파일을 작성하면 문제를 방지합니다.
- Makefiles를 그룹화하여 관련 기능을 함께 구성하십시오.
- 모든 명령이 리포지토리의 신선한 클론에서 작동하는지 확인하십시오. 깨진 설정 프로세스와 같은 새로운 기고자를 좌절시키는 것은 없습니다.
틀 결론
Makefiles는 구식 도구처럼 보일 수 있지만 Python 프로젝트에는 효과적입니다. 그들은 일반적인 작업을위한 일관된 인터페이스를 제공하고 새로운 기고자가 생산성을 빨리 얻을 수 있도록 도와줍니다.
그냥 설치, 테스트 및 도움말 명령으로 기본 makefile을 만듭니다. 프로젝트가 커지고 워크 플로가 더욱 복잡해지면 필요에 따라 더 많은 목표와 종속성을 추가 할 수 있습니다.
목표는 가장 영리하거나 복잡한 메이크 파일을 만드는 것이 아닙니다. 일상적인 개발 작업을보다 쉽고 신뢰할 수 있도록하는 것입니다. 간단하게 유지하고, 유용하게 유지하고, Makefile이 Python Project 혼돈에 주문을 제공하는 명령 센터가되도록하십시오.
발라 프리 야 c 인도의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학 및 컨텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 지식에는 DevOps, 데이터 과학 및 자연어 처리가 포함됩니다. 그녀는 독서, 쓰기, 코딩 및 커피를 즐깁니다! 현재 그녀는 자습서, 방법 안내, 의견 조각 등을 통해 개발자 커뮤니티와 지식을 배우고 공유하는 작업을하고 있습니다. Bala는 또한 매력적인 리소스 개요 및 코딩 자습서를 만듭니다.
Post Comment