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

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

파이썬 프로젝트에서 Makefiles의 사례 파이썬 프로젝트에서 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

당신은 놓쳤을 수도 있습니다