레퍼런스
의존성 고정 매니페스트
Python 런타임 범위, 개발 도구, 릴리스 도구 잠금 파일, 각 빌드 표면에 대한 승인된 버전 하한을 다루는 의존성 선언 정책.
Apothem이 의존성을 선언하고, 고정하고, 잠그는 방식에 대한 승인된 자세. 대상: 재현성 모델을 이해해야 하는 기여자 및 다운스트림 소비자.
자세
Apothem은 작은 런타임 의존성 집합과 더 큰 개발·감사·릴리스·문서 도구 체인을 갖춘
Python CLI입니다. 런타임 의존성은 pyproject.toml에서 보수적인 하한을 사용합니다.
웹사이트는 site/package-lock.json을 커밋합니다. GitHub Actions는 버전 주석과 함께
불변 SHA로 고정되며 Renovate에 의해 업그레이드됩니다.
| 클래스 | 선언 | 잠금 정책 |
|---|---|---|
| 런타임 Python 의존성 | pyproject.toml의 [project.dependencies] | 하한 범위; 커밋되는 Python 런타임 잠금 없음 |
| 개발 / 보안 도구 | [project.optional-dependencies] extras | 하한 범위; CI는 현재 일치하는 버전을 설치 |
| 릴리스 도구 | scripts/release/requirements-build-linux.txt | 릴리스 워크플로용 해시 잠금; 릴리스 도구 클로저에서 생성 |
| CI 전용 도구 | .github/workflows/*.yml | 워크플로 전용 pip 도구는 정확한 고정을 사용(pip, bandit, pip-audit, pip-licenses, pyinstaller) |
| 문서 사이트 | site/package.json | site/package-lock.json을 커밋하고 npm ci가 소비 |
| GitHub Actions | 버전 주석이 있는 SHA 고정 uses: 참조 | Renovate가 업데이트를 제안; 예외는 action-pinning-exempt: 마커를 지님 |
릴리스 승인
| 표면 | 승인된 상태 | 근거 |
|---|---|---|
| 런타임 의존성 | 현재 하한은 pyproject.toml [project.dependencies]에 있음 | 릴리스 전에 승인된 현재 안정 하한; 알려진 런타임 CVE 차단 요소 없음 |
| 개발 도구 | 현재 하한은 pyproject.toml의 dev extra에 있음 | 릴리스 전에 승인된 최신 안정 하한 |
| 보안 도구 | 현재 하한은 pyproject.toml의 security extra에 있음 | 릴리스 전에 승인된 현재 스캐너 하한 |
| 릴리스 도구 | 해시 잠금 클로저는 scripts/release/requirements-build-linux.txt에 있음 | 릴리스 워크플로는 --require-hashes로 설치; 로컬 스크립트는 변동하는 의존성을 조용히 설치하는 대신 build이 이미 존재할 것을 요구 |
| 문서 도구 | 현재 범위는 site/package.json에 있고, 정확한 해결은 site/package-lock.json에 있음 | 잠금 파일 새로 고침 후 npm outdated는 오래된 문서 의존성을 반환하지 않음 |
| GitHub Actions | 현재 릴리스에는 기존 SHA 고정을 유지; SLSA 재사용 가능 워크플로는 문서화된 태그 고정 예외로 유지 | 공개 CI 재실행은 그린; 릴리스 표면의 동요를 피하기 위해 광범위한 action 메이저 업그레이드는 의도적으로 의존성 자동화 PR에 맡김 |
| npm 패키징 | 수동 전용 publish-npm.yml 워크플로; 자동 릴리스 트리거 없음 | 유일한 공개 npm 패키지는 @ahmed-g-gad/apothem; 게시는 릴리스 준비가 통과한 후 실행 |
잠금
Python 잠금 파일은 기여자가 필요할 때 생성합니다. Apothem의 런타임 클로저가 작고, CLI가 여러 Python 마이너 버전을 지원하며, CI가 의도적으로 최신의 일치하는 도구 버전을 연습하기 때문에 이들은 커밋되지 않습니다.
# Astral uv:
uv pip install -e ".[dev,security,release]"
uv pip freeze > requirements.dev.lock
# pip-tools:
pip-compile --extra=dev --extra=security --extra=release -o requirements.dev.lock pyproject.toml
# Plain pip:
pip install -e ".[dev,security,release]"
pip freeze > requirements.dev.lock웹사이트는 다릅니다. site/package-lock.json이 커밋되고 CI가 npm ci를 사용하므로,
렌더링된 문서 사이트에는 재현 가능한 Node 클로저가 있습니다.
근거
- Python에 범위 고정을 쓰는 이유는? CLI는 광범위한 Python 매트릭스를 지원하며, CI는 사용자가 마주치기 전에 현재 도구와의 호환성 문제를 드러내야 합니다.
- 커밋되는 Node 잠금을 쓰는 이유는? 웹사이트는 배포된 정적 산출물입니다. 잠금
파일은 그 공개 표면에 대해 결정론적
npm ci빌드를 제공합니다. - SHA 고정 Actions를 쓰는 이유는? 태그는 가변적이지만 SHA는 불변입니다. Renovate는 고정된 SHA를 업데이트하고, 릴리스 게이트는 의도적인 보류를 모두 기록합니다.