Git Hook을 사용한 Python의 시맨틱 버전 관리
46843 단어 python100daysofpython
This is Day 22 of the #100DaysOfPython challenge.
이 게시물은
pre-commit
및 commitizen
패키지를 사용하여 커밋을 기반으로 Python용 시맨틱 버전 관리를 자동화합니다.게시물은 게시물"Your First Pip Package With Python"에서 수행한 작업을 기반으로 합니다.
최종 코드는 here 에서 찾을 수 있습니다.
전제 조건
시작하기
okeeffed/your-first-pip-package-in-python
저장소에서 복제 및 작업을 수행하고 필요한 패키지를 설치합니다.$ git clone https://github.com/okeeffed/your-first-pip-package-in-python semantic-versioning-in-python-with-git-hooks
$ cd semantic-versioning-in-python-with-git-hooks
# Init the virtual environment
$ pipenv install --dev pre-commit Commitizen toml
# Create some required files
$ touch .pre-commit-config.yaml
이 단계에서 사전 커밋 후크를 구성할 준비가 되었습니다.
사전 커밋 구성
.pre-commit-config.yaml
에 다음을 추가해야 합니다.---
repos:
- repo: https://github.com/commitizen-tools/commitizen
rev: master
hooks:
- id: commitizen
stages: [commit-msg]
완료되면
Commitizen
구성을 설정할 수 있습니다.커밋 설정
다음을 실행하여 설정할 수 있습니다.
pipenv run cz init
:$ pipenv run cz init
? Please choose a supported config file: (default: pyproject.toml) pyproject.toml
? Please choose a cz (commit rule): (default: cz_conventional_commits) cz_conventional_commits
No Existing Tag. Set tag to v0.0.1
? Please enter the correct version format: (default: "$version")
? Do you want to install pre-commit hook? Yes
commitizen already in pre-commit config
commitizen pre-commit hook is now installed in your '.git'
You can bump the version and create changelog running:
cz bump --changelog
The configuration are all set.
이제 커밋이 버전 관리에 영향을 줄 수 있는 단계에 있습니다! 파일이 생성됩니다
pyproject.toml
.[tool]
[tool.commitizen]
name = "cz_conventional_commits"
version = "0.0.1"
tag_format = "$version"
여기에는 Commitizen이 우리를 위해 유지 관리하는 버전 정보가 포함됩니다.
직장에서 자동화된 시맨틱 버전 관리
먼저 버전
0.0.1
에 대한 태그를 생성해야 합니다.$ git tag -a 0.0.1 -m "Init version"
커밋에 부여한 이름에 따라 버전이 변경됩니다. 설치된 Git 후크는 커밋이 Conventional Commits 명명 규칙을 따르도록 합니다.
실제로 이것을 봅시다. 먼저 파일에 새 함수를 추가해 보겠습니다
demo_pip_math/math.py
.def divide(x: int, y: int) -> float:
"""divide one number by another
Args:
x (int): first number in the division
y (int): second number in the division
Returns:
int: division of x and y
"""
return x / y
이 코드를 추가하고 커밋하려고 합니다. 잘못된 버전을 설정하면 어떻게 되는지 살펴보겠습니다.
$ git add demo_pip_math/math.py
$ git commit -m "added new feature division"
commitizen check.........................................................Failed
- hook id: commitizen
- exit code: 14
commit validation: failed!
please enter a commit message in the commitizen format.
commit "": "not a valid commit name"
pattern: (build|ci|docs|feat|fix|perf|refactor|style|test|chore|revert|bump)(\(\S+\))?!?:(\s.*)
이것은 우리가 예상한 패턴과 일치하지 않았다는 것을 알려줍니다.
새로운 기능을 추가한다고 가정하고
feat:
접두사를 사용해 보겠습니다.$ git commit -m "feat: added new divide functionality"
commitizen check.........................................................Passed
[main 333d291] feat: added new divide functionality
1 file changed, 13 insertions(+)
우리는 통과했다!
이제 변경을 수행했으므로
Commitizen
를 사용하여 버전을 업데이트하고 변경 로그를 만들고 버전을 업데이트할 수 있습니다.$ pipenv run cz bump
bump: version 0.0.1 → 0.1.0
tag to create: 0.1.0
increment detected: MINOR
Done!
이제
pyproject.toml
를 확인하면 해당 변경 사항이 반영된 것을 볼 수 있습니다.[tool]
[tool.commitizen]
name = "cz_conventional_commits"
version = "0.1.0"
tag_format = "$version"
변경 로그 생성
변경 로그를 생성하려면
pipenv run cz changelog
를 실행하십시오.$ pipenv run cz changelog
# ... no output
이렇게 하면 프로젝트 루트 디렉터리에
CHANGELOG.md
파일이 생성되며 이제 다음 정보가 포함됩니다.## 0.1.0 (2021-08-10)
### Feat
- added new divide functionality
## 0.0.1 (2021-08-10)
### Feat
- add in division function
- init commit
성공!
setup.py 동기화 유지
마지막으로
setup.py
가 pyproject.toml
에 반영된 것과 동기화되었는지 확인하려고 합니다.toml
패키지로 이것을 할 수 있습니다.setup.py
내부에서 파일을 다음과 같이 변경합니다.import setuptools
import toml
from os.path import join, dirname, abspath
pyproject_path = join(dirname(abspath("__file__")),
'../pyproject.toml')
file = open(pyproject_path, "r")
toml_str = file.read()
parsed_toml = toml.loads(toml_str)
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="demo_pip_math",
version=parsed_toml['tool']['commitizen']['version'],
author="Dennis O'Keeffe",
author_email="[email protected]",
description="Demo your first Pip package.",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/okeeffed/your-first-pip-package-in-python",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
keywords='pip-demo math',
project_urls={
'Homepage': 'https://github.com/okeeffed/your-first-pip-package-in-python',
},
)
TOML을 읽고 현재 버전에 대한 참조를 찾고 있습니다.
리포지토리에 이미 추가된
build
스크립트를 사용하여 이것이 여전히 예상대로 작동하는지 확인할 수 있습니다.$ pipenv run build
running sdist
running egg_info
creating demo_pip_math.egg-info
writing demo_pip_math.egg-info/PKG-INFO
writing dependency_links to demo_pip_math.egg-info/dependency_links.txt
writing top-level names to demo_pip_math.egg-info/top_level.txt
writing manifest file 'demo_pip_math.egg-info/SOURCES.txt'
reading manifest file 'demo_pip_math.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
adding license file 'LICENSE'
writing manifest file 'demo_pip_math.egg-info/SOURCES.txt'
running check
creating demo_pip_math-0.1.0
creating demo_pip_math-0.1.0/demo_pip_math
creating demo_pip_math-0.1.0/demo_pip_math.egg-info
creating demo_pip_math-0.1.0/tests
copying files to demo_pip_math-0.1.0...
copying LICENSE -> demo_pip_math-0.1.0
copying MANIFEST.in -> demo_pip_math-0.1.0
copying README.md -> demo_pip_math-0.1.0
copying pyproject.toml -> demo_pip_math-0.1.0
copying setup.py -> demo_pip_math-0.1.0
copying demo_pip_math/__init__.py -> demo_pip_math-0.1.0/demo_pip_math
copying demo_pip_math/math.py -> demo_pip_math-0.1.0/demo_pip_math
copying demo_pip_math.egg-info/PKG-INFO -> demo_pip_math-0.1.0/demo_pip_math.egg-info
copying demo_pip_math.egg-info/SOURCES.txt -> demo_pip_math-0.1.0/demo_pip_math.egg-info
copying demo_pip_math.egg-info/dependency_links.txt -> demo_pip_math-0.1.0/demo_pip_math.egg-info
copying demo_pip_math.egg-info/top_level.txt -> demo_pip_math-0.1.0/demo_pip_math.egg-info
copying tests/__init__.py -> demo_pip_math-0.1.0/tests
copying tests/test_math.py -> demo_pip_math-0.1.0/tests
Writing demo_pip_math-0.1.0/setup.cfg
creating dist
Creating tar archive
removing 'demo_pip_math-0.1.0' (and everything under it)
running bdist_wheel
running build
running build_py
creating build
creating build/lib
creating build/lib/demo_pip_math
copying demo_pip_math/__init__.py -> build/lib/demo_pip_math
copying demo_pip_math/math.py -> build/lib/demo_pip_math
creating build/lib/tests
copying tests/__init__.py -> build/lib/tests
copying tests/test_math.py -> build/lib/tests
warning: build_py: byte-compiling is disabled, skipping.
installing to build/bdist.macosx-11-x86_64/wheel
running install
running install_lib
creating build/bdist.macosx-11-x86_64
creating build/bdist.macosx-11-x86_64/wheel
creating build/bdist.macosx-11-x86_64/wheel/demo_pip_math
copying build/lib/demo_pip_math/__init__.py -> build/bdist.macosx-11-x86_64/wheel/demo_pip_math
copying build/lib/demo_pip_math/math.py -> build/bdist.macosx-11-x86_64/wheel/demo_pip_math
creating build/bdist.macosx-11-x86_64/wheel/tests
copying build/lib/tests/__init__.py -> build/bdist.macosx-11-x86_64/wheel/tests
copying build/lib/tests/test_math.py -> build/bdist.macosx-11-x86_64/wheel/tests
warning: install_lib: byte-compiling is disabled, skipping.
running install_egg_info
Copying demo_pip_math.egg-info to build/bdist.macosx-11-x86_64/wheel/demo_pip_math-0.1.0-py3.9.egg-info
running install_scripts
adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
creating build/bdist.macosx-11-x86_64/wheel/demo_pip_math-0.1.0.dist-info/WHEEL
creating 'dist/demo_pip_math-0.1.0-py3-none-any.whl' and adding 'build/bdist.macosx-11-x86_64/wheel' to it
adding 'demo_pip_math/__init__.py'
adding 'demo_pip_math/math.py'
adding 'tests/__init__.py'
adding 'tests/test_math.py'
adding 'demo_pip_math-0.1.0.dist-info/LICENSE'
adding 'demo_pip_math-0.1.0.dist-info/METADATA'
adding 'demo_pip_math-0.1.0.dist-info/WHEEL'
adding 'demo_pip_math-0.1.0.dist-info/top_level.txt'
adding 'demo_pip_math-0.1.0.dist-info/RECORD'
removing build/bdist.macosx-11-x86_64/wheel
이 빌드에서 버전
0.1.0
이 사용되었음을 알 수 있습니다.요약
오늘의 게시물은
commitizen
, pre-commit
및 toml
패키지를 사용하여 기존 커밋을 기반으로 하는 버전 관리 프로세스를 자동화하는 방법을 보여주었습니다.이는 대규모 팀이 작업에 약간의 노력을 추가하면서 패키지를 의미론적으로 올바르게 유지하는 데 도움이 됩니다.
리소스 및 추가 읽을거리
pre-commit
commitizen
사진 제공:
snapsbyclark
원래 내blog에 게시되었습니다. 새 게시물을 지체 없이 보려면 거기에 있는 게시물을 읽고 내 뉴스레터를 구독하십시오.
Reference
이 문제에 관하여(Git Hook을 사용한 Python의 시맨틱 버전 관리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/okeeffed/semantic-versioning-in-python-with-git-hooks-5c5a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)