new-python-project
npx skills add https://github.com/ynz012x/skills --skill new-python-project
Agent 安装分布
Skill 文档
Python 项ç®åå§å
æµç¨æ¦è¿°
- 确认项ç®ä¿¡æ¯ – ä¸ç¨æ·äº¤äºç¡®è®¤é¡¹ç®åç§°å Python çæ¬
- åå§åé¡¹ç® – ä½¿ç¨ uv init å建项ç®ï¼å¯ç¨ git çæ¬æ§å¶
- é 置代ç è§èæ£æ¥ – ä½¿ç¨ pre-commit 管çå¹¶åå§å代ç è§èæ£æ¥ hooksï¼å¹¶åºç¨ç¸åºçè§èé ç½®
- é ç½®æµè¯æ¡æ¶ – æ·»å pytestãpytest-cov å¼åä¾èµ
- é ç½®çæ¬ç®¡çå·¥å · – é ç½® .gitignore ä¼åVCS管çï¼é ç½®çæ¬å ä¿¡æ¯ï¼é ç½® bumpversion è¿è¡è¯ä¹åçæ¬ç®¡ç
- æ·»å 常ç¨å¼åå·¥å · – æ·»å ipython ç¨äºæ¬å°è°è¯
- å®è£ å¹¶éªè¯ – å®è£ ææä¾èµå¹¶éªè¯é ç½®
- æ´æ°README – åå»ºå¹¶æ´æ°READMEæä»¶ï¼æ·»å 项ç®ä½¿ç¨è¯´æ
- 宿åå§æäº¤
Step 1: 确认项ç®ä¿¡æ¯
ä¸ç¨æ·ç¡®è®¤ä»¥ä¸ä¿¡æ¯ï¼
- 项ç®åç§° project_name: é»è®¤ä½¿ç¨å½åç®å½åç§°
- é¡¹ç®æè¿° project_description: ç®ççé¡¹ç®æè¿°ä¿¡æ¯ï¼ç¨äºå¿«éç解项ç®åè½åå®ä½
- Python çæ¬ python_version: æ¨è使ç¨å®æ¹æ¯æççæ¬ï¼3.10å以ä¸ï¼
Step 2: åå§å项ç®
ä½¿ç¨ uv åå§å项ç®ï¼å¯ç¨ git çæ¬æ§å¶ï¼
uv init \
# 项ç®åç§°
--name=<project_name> \
# é¡¹ç®æè¿°
--description="<project_description>" \
# åå§å src/<project_name> å
ç®å½
--package \
# åå§å git
--vcs=git \
# Python æä½æ¯æçæ¬
--python=<python_version>
Step 3: é 置代ç è§èæ£æ¥
æ·»å pre-commit åä»£ç æ ¼å¼åå·¥å ·ï¼
uv add --dev pre-commit black flake8 flake8-import-order ruff
å° assets/pre-commit-config.yaml å
容åå
¥é¡¹ç®æ ¹ç®å½ç .pre-commit-config.yaml æä»¶
å° assets/flake8.j2 模æ¿åºç¨å°é¡¹ç®æ ¹ç®å½ç .flake8 æä»¶ï¼æ¿æ¢åé {{ project_name }} 为项ç®åç§°
å®è£ pre-commit hooksï¼
uv run pre-commit install
Step 4: é ç½®æµè¯æ¡æ¶
æ·»å pytest å pytest-cov å¼åä¾èµï¼
uv add --dev pytest pytest-cov
å建 tests ç®å½ååå§æµè¯æä»¶ï¼
mkdir -p tests
touch tests/__init__.py
å¨ pyproject.toml 䏿·»å pytest é
ç½®ï¼
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*", "*Test"]
python_functions = ["test_*"]
addopts = [
"-v",
"--cov=src/<project_name>",
"--cov-report=term-missing",
"--tb=short",
]
[tool.coverage.run]
source = ["src/<project_name>"]
branch = true
omit = ["tests/*"]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"raise NotImplementedError",
"if __name__ == .__main__.:",
]
Step 5: é ç½®çæ¬ç®¡çå·¥å ·
æ·»å .gitignore
curl https://raw.githubusercontent.com/github/gitignore/refs/heads/main/Python.gitignore -o .gitignore
æ·»å bumpversion ä¾èµï¼
uv add --dev bumpversion
é ç½®çæ¬å ä¿¡æ¯
-
æ°å»º
src/<project_name>/_version.pyæä»¶ç¨äºä¿å项ç®çæ¬å ä¿¡æ¯<code class="language-python:src//_version.py code-highlight">__version__ = "0.1.0" -
å°çæ¬ä¿¡æ¯å¯¼åºå°é¡¹ç®å å½å空é´ï¼è°æ´
src/<project_name>/__init__.py<code class="language-python:src//__init__.py code-highlight">"""<project_name> package.""" from ._version import __version__ # noqa: F401
-
æ·»å æµè¯ç¨ä¾ç¨äºéªè¯çæ¬å ä¿¡æ¯è·å
from <project_name> import __version__ def test_version(): assert __version__
å° assets/bumpversion.cfg.j2 模æ¿åºç¨å°é¡¹ç®æ ¹ç®å½ç .bumpversion.cfg æä»¶ï¼æ¿æ¢åé {{ project_name }} 为项ç®åç§°
Step 6: æ·»å 常ç¨å¼åå·¥å ·
uv add --dev ipython
Step 7: å®è£ å¹¶éªè¯
å®è£ ææä¾èµï¼
uv sync
éªè¯é ç½®ï¼
# éªè¯ pytest
uv run pytest
# éªè¯ pre-commit
uv run pre-commit run --all-files
# éªè¯ bumpversion
uv run bumpversion --help
# éªè¯çæ¬å
ä¿¡æ¯
uv run python -c 'from <project_name> import __version__; print(__version__)'
Step 8: æ´æ°README
ä½¿ç¨æ¨¡æ¿ assets/README.md.j2 çæé¡¹ç® README æä»¶ï¼æ¿æ¢ä»¥ä¸åéï¼
{{ project_name }}– 项ç®åç§°{{ project_description }}– é¡¹ç®æè¿°
å°çæçå
容åå
¥é¡¹ç®æ ¹ç®å½ç README.md æä»¶ã
Step 9: 宿åå§æäº¤
git add .
git commit -m "Initial project setup"