Skip to content

Commit a8e2344

Browse files
committed
docs: clarify option C faq
1 parent bf7acde commit a8e2344

2 files changed

Lines changed: 267 additions & 4 deletions

File tree

โ€Ždocs/developer/VERSIONING.mdโ€Ž

Lines changed: 267 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@
1111

1212
---
1313

14+
## ์š”์•ฝ
15+
16+
| ์˜ต์…˜ | ๋นŒ๋“œ ๊ฒฝ๋กœ | ๋ฒ„์ „ ์†Œ์Šค(SoT) | ์ฃผ์š” ์žฅ์  | ์ฃผ์š” ๋‹จ์  | ๊ถŒ์žฅ ์ƒํ™ฉ |
17+
|---|---|---|---|---|---|
18+
| A (setuptools-scm) | `python -m build` (PEP 517, setuptools) | Git ํƒœ๊ทธ (`setuptools-scm`) | ๋‹จ์ผ ์†Œ์Šค, placeholder ์ œ๊ฑฐ, ๋Ÿฐํƒ€์ž„/๋ฐฐํฌ ์ž๋™ ์ผ์น˜ | `poetry build` ๋น„ํ˜ธํ™˜, VCS ๋ฉ”ํƒ€ ํ•„์š”, ํƒœ๊ทธ ์—†์„ ๋•Œ fallback ๋ฒ„์ „ ์ฒ˜๋ฆฌ ํ•„์š” | Poetry ๋นŒ๋“œ ์˜์กด์ด ์•ฝํ•˜๊ณ  ํ‘œ์ค€ PEP 517 ๋นŒ๋“œ๋ฅผ ์„ ํ˜ธํ•  ๋•Œ |
19+
| B (ํ˜„ํ–‰ + CI ๊ฒ€์‚ฌ) | `poetry build` | `__env__.py` CI ์น˜ํ™˜ | ๋ณ€๊ฒฝ ์ตœ์†Œ, ์ฆ‰์‹œ ์ ์šฉ | ์ด์ค‘ ๊ด€๋ฆฌ ์ง€์†, ์น˜ํ™˜/๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ ์œ ์ง€ ๋น„์šฉ | ๋‹จ๊ธฐ ์œ ์ง€/๊ธด๊ธ‰ ๋ฆด๋ฆฌ์Šค ์•ˆ์ •ํ™” ํ•„์š” ์‹œ |
20+
| C (Poetry ํ”Œ๋Ÿฌ๊ทธ์ธ) | `poetry build` | ํ”Œ๋Ÿฌ๊ทธ์ธ(`poetry-dynamic-versioning`) | Poetry ๋‹จ์ผ ๊ฒฝ๋กœ, ํƒœ๊ทธโ†’๋ฒ„์ „ ์ž๋™ํ™” | ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜์กด, ์„ค์ • ์ถฉ๋Œ ์‹œ ์ •๋ฆฌ ํ•„์š” | ํŒ€์ด Poetry์— ํ‘œ์ค€ํ™”๋˜์–ด ์žˆ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ํ—ˆ์šฉ ์‹œ |
21+
| D (Poetry, CI ์ฃผ์ž…) | `poetry build` | CI ํƒœ๊ทธโ†’PEP 440 ์ •๊ทœํ™” ํ›„ `poetry version` | ํ”Œ๋Ÿฌ๊ทธ์ธ ๋น„์˜์กด, CI ์ œ์–ด ์šฉ์ด | ์ •๊ทœํ™” ์Šคํฌ๋ฆฝํŠธ ์œ ์ง€, ๋น„ํƒœ๊ทธ ์ •์ฑ… ์ •์˜ ํ•„์š” | CI ๊ทœ์œจ ๊ฐ•ํ•˜๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ ค๋Š” ๊ฒฝ์šฐ |
22+
1423
## ํ˜„ํ–‰ ์„ค๊ณ„
1524

1625
### ๊ตฌ์„ฑ ์š”์†Œ
@@ -55,6 +64,29 @@
5564
- ํƒœ๊ทธ๋งŒ์œผ๋กœ ๋ฐฐํฌ ๋ฒ„์ „, ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „ ์ž๋™ ์ผ์น˜
5665
- placeholder ์น˜ํ™˜ ์Šคํ… ์ œ๊ฑฐ(๋‹จ์ˆœํ™”)
5766

67+
#### ๋‹จ์  (A์•ˆ)
68+
- `poetry build`์™€ ์ง์ ‘ ํ˜ธํ™˜๋˜์ง€ ์•Š์Œ: `[tool.poetry].version` ์ œ๊ฑฐ ์‹œ Poetry๋Š” ๋นŒ๋“œ ๋ฒ„์ „์„ ์š”๊ตฌํ•˜์—ฌ ์‹คํŒจํ•จ. ์ˆœ์ˆ˜ A์•ˆ์€ `python -m build`๋กœ ๋นŒ๋“œ ๊ฒฝ๋กœ ์ „ํ™˜ ํ•„์š”.
69+
- VCS ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์กด: ํƒœ๊ทธ/์ปค๋ฐ‹ ์ •๋ณด๊ฐ€ ์—†๊ฑฐ๋‚˜ ์†Œ์Šค๊ฐ€ VCS ์™ธ๋ถ€๋กœ ์ถ”์ถœ๋œ ๊ฒฝ์šฐ ๋ฒ„์ „ ์ถ”๋ก ์ด ์–ด๋ ค์›Œ `0.0.0+unknown` ๊ฐ™์€ fallback์„ ์“ธ ์ˆ˜ ์žˆ์Œ.
70+
- ๋„๊ตฌ์ฒด์ธ ํ˜ผํ•ฉ ๊ด€๋ฆฌ ๋น„์šฉ: Poetry๋ฅผ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ์›Œํฌํ”Œ๋กœ(์˜ˆ: `poetry install`)์™€ ๋นŒ๋“œ ์ฒด์ธ์ด ๋ถ„๋ฆฌ๋˜๋ฉฐ, ์„ค์ • ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ฆฌ(๋ถˆํ•„์š”ํ•œ `[tool.poetry].version` ์ œ๊ฑฐ ๋“ฑ)๊ฐ€ ํ•„์š”.
71+
- ๋กœ์ปฌ ๋น„ํƒœ๊ทธ ๊ฐœ๋ฐœ ๋ฒ„์ „ ์ •์ฑ… ํ•„์š”: ํƒœ๊ทธ๊ฐ€ ์—†๋Š” ๋ธŒ๋žœ์น˜์—์„œ์˜ ๋ฒ„์ „ ํ‘œ๊ธฐ(`+devN`, `+dirty`) ํ—ˆ์šฉ/๋…ธ์ถœ ์ •์ฑ…์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋จ.
72+
73+
#### Poetry ๋นŒ๋“œ ํ˜ธํ™˜์„ฑ (๊ฒ€ํ†  ๊ฒฐ๊ณผ ๋ฐ˜์˜)
74+
- ํ™•์ธ๋œ ์‚ฌ์‹ค: `[tool.poetry].version`๋ฅผ ์ œ๊ฑฐํ•œ ์ƒํƒœ์—์„œ `poetry build`๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๋กœ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
75+
- ๋ฉ”์‹œ์ง€: "Either [project.version] or [tool.poetry.version] is required in package mode."
76+
- ๊ฒฐ๋ก : ์˜ต์…˜ A๋ฅผ ์ฑ„ํƒํ•˜๋ฉด์„œ ๋™์‹œ์— `poetry build`๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ง€๋Š” ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
77+
1) ๋นŒ๋“œ ๊ฒฝ๋กœ๋ฅผ Poetry์—์„œ PEP 517 ํ‘œ์ค€ ๋นŒ๋“œ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
78+
- ๊ถŒ์žฅ ๋ช…๋ น: `python -m build` (๋˜๋Š” `pipx run build`)
79+
- ์ด ๊ฒฝ๋กœ์—์„œ๋Š” `[project] dynamic`๊ณผ `setuptools-scm`๊ฐ€ ๋ฒ„์ „์„ ํ•ด๊ฒฐํ•˜๋ฉฐ, `[tool.poetry].version`์ด ์—†์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
80+
2) ๊ณ„์† Poetry๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ์˜ต์…˜ A๊ฐ€ ์•„๋‹Œ ์˜ต์…˜ C(ํ”Œ๋Ÿฌ๊ทธ์ธ) ๋˜๋Š” ์˜ต์…˜ D(CI ์ฃผ์ž…)๋กœ ๋ฒ„์ „์„ `tool.poetry.version`์— ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
81+
- ์˜ต์…˜ C: `poetry-dynamic-versioning` ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํƒœ๊ทธโ†’๋ฒ„์ „ ์ž๋™ํ™”
82+
- ์˜ต์…˜ D: CI์—์„œ ํƒœ๊ทธ๋ฅผ PEP 440์œผ๋กœ ์ •๊ทœํ™” ํ›„ `poetry version`์œผ๋กœ ์ฃผ์ž…
83+
84+
#### ๊ถŒ์žฅ ๋นŒ๋“œ ๊ฒฝ๋กœ (์˜ต์…˜ A๋ฅผ ์ˆœ์ˆ˜ ์ ์šฉ ์‹œ)
85+
- ๋กœ์ปฌ/CI ๊ณตํ†ต:
86+
- `pipx install build`
87+
- `python -m build`
88+
- CI์—์„œ ํƒœ๊ทธ๊ฐ€ ์—†๋Š” ์ปค๋ฐ‹์— ๋Œ€ํ•ด์„  `setuptools-scm`์˜ `+devN`/`+dirty` ํ˜•์‹ ํ—ˆ์šฉ ์ •์ฑ…์„ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.
89+
5890
### ์˜ต์…˜ B: ํ˜„์žฌ ๊ตฌ์กฐ ์œ ์ง€ + CI ์ •ํ•ฉ์„ฑ ๊ฒ€์‚ฌ ์ถ”๊ฐ€
5991
- CI์—์„œ ๋‹ค์Œ์„ ๋ณด์žฅ:
6092
- ํƒœ๊ทธ `vX.Y.Z` โ†’ `__env__.py` ์น˜ํ™˜ โ†’ ๋นŒ๋“œ ํ›„ ํœ  `Metadata-Version` ํ™•์ธ
@@ -121,6 +153,95 @@ __version__ = _dist_version("python-kis")
121153
- ์˜ต์…˜ C๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒฝ์šฐ, `[build-system]`์˜ `setuptools-dynamic` ๊ฒฝ๋กœ๋Š” ์ œ๊ฑฐํ•˜์—ฌ ๋‹จ์ผ ๊ฒฝ๋กœ(Poetry)๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
122154
- ๋ฌธ์„œ์— "๋ฒ„์ „์€ Git ํƒœ๊ทธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค"๋ฅผ ๋ช…์‹œํ•˜๊ณ , ํƒœ๊ทธ ์—†์ด ๋ฐฐํฌ ๊ธˆ์ง€ ๊ทœ์น™์„ CI๋กœ enforce ํ•ฉ๋‹ˆ๋‹ค.
123155

156+
#### ๊ฐœ๋ฐœ ๋ฒ„์ „(.devN) ์šด์˜ ๊ฐ€์ด๋“œ (์˜ต์…˜ C)
157+
- ์›์น™: ๊ฐœ๋ฐœ/ํ”„๋ฆฌ๋ทฐ ๋ฒ„์ „์€ Git "ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ"๋กœ ํ‘œ๊ธฐํ•œ ๋’ค ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ด๋ฅผ PEP 440 ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
158+
- ํƒœ๊ทธ ํฌ๋งท ๊ทœ์น™(๊ถŒ์žฅ):
159+
- `vX.Y.Z-dev.N` โ†’ `X.Y.Z.devN`
160+
- `vX.Y.Z-rc.N` โ†’ `X.Y.ZrcN`
161+
- `vX.Y.Z-beta.N` โ†’ `X.Y.ZbN`
162+
- `vX.Y.Z-alpha.N` โ†’ `X.Y.ZaN`
163+
- ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •(์˜ˆ์‹œ):
164+
165+
```toml
166+
[tool.poetry]
167+
version = "0.0.0" # placeholder, ์‹ค์ œ ๋ฒ„์ „์€ ํƒœ๊ทธ์—์„œ ์ฃผ์ž…
168+
169+
[tool.poetry-dynamic-versioning]
170+
enable = true
171+
vcs = "git"
172+
style = "pep440"
173+
strict = true # ํƒœ๊ทธ๊ฐ€ ์—†์œผ๋ฉด ๋นŒ๋“œ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌ(๊ถŒ์žฅ)
174+
tagged-metadata = true
175+
```
176+
177+
- ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ(์˜ˆ์‹œ):
178+
1) ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ ํ”„๋ฆฌ๋ทฐ ํƒœ๊ทธ ์ƒ์„ฑ
179+
180+
```bash
181+
git tag v2.3.0-dev.1
182+
git push origin v2.3.0-dev.1
183+
```
184+
185+
2) CI๊ฐ€ ํƒœ๊ทธ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด `poetry build` ์‹คํ–‰, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด `2.3.0.dev1`์„ ์ฃผ์ž…
186+
3) ๊ฐœ๋ฐœ/ํ”„๋ฆฌ๋ทฐ ํƒœ๊ทธ๋Š” TestPyPI๋กœ๋งŒ ๊ฒŒ์‹œ, ์ •์‹ ํƒœ๊ทธ(`vX.Y.Z`)๋งŒ PyPI ๊ฒŒ์‹œ
187+
188+
- ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋นŒ๋“œ(ํƒœ๊ทธ ์—†์ด):
189+
- ํŒ€ ๊ทœ์น™์ƒ ํƒœ๊ทธ๋ฅผ ์š”๊ตฌํ•˜์ง€๋งŒ, ์ž„์‹œ ์Šค๋ƒ…์ƒท์ด ํ•„์š”ํ•˜๋ฉด ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๋ฐฐํฌ ๊ธˆ์ง€).
190+
- ์ž„์‹œ๋กœ `strict = false`๋กœ ๋‚ฎ์ถฐ ๋กœ์ปฌ ๋นŒ๋“œ๋งŒ ์ˆ˜ํ–‰(๋ฒ„์ „ ์ž๋™ํ™”๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ).
191+
- ๋˜๋Š” ๋กœ์ปฌ์—์„œ ์ˆ˜๋™์œผ๋กœ `poetry version "X.Y.Z.devN"` ์‹คํ–‰ ํ›„ ๋นŒ๋“œ(๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ ๊ธˆ์ง€).
192+
193+
- CI ์˜ˆ์‹œ(ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ ๋ถ„๊ธฐ):
194+
195+
```yaml
196+
jobs:
197+
build-and-publish:
198+
if: startsWith(github.ref, 'refs/tags/v')
199+
runs-on: ubuntu-latest
200+
steps:
201+
- uses: actions/checkout@v4
202+
- uses: actions/setup-python@v5
203+
with: { python-version: '3.11' }
204+
- name: Install Poetry
205+
run: pipx install poetry
206+
- name: Install deps
207+
run: poetry install --no-interaction --with=dev
208+
- name: Build
209+
run: poetry build
210+
- name: Decide publish target
211+
id: target
212+
shell: bash
213+
run: |
214+
TAG="${GITHUB_REF_NAME}"
215+
if [[ "$TAG" == *"-dev."* || "$TAG" == *"-alpha."* || "$TAG" == *"-beta."* || "$TAG" == *"-rc."* ]]; then
216+
echo "name=testpypi" >> "$GITHUB_OUTPUT"
217+
else
218+
echo "name=pypi" >> "$GITHUB_OUTPUT"
219+
fi
220+
- name: Configure repository
221+
shell: bash
222+
run: |
223+
if [ "${{ steps.target.outputs.name }}" = "testpypi" ]; then
224+
poetry config repositories.testpypi https://test.pypi.org/legacy/
225+
poetry config pypi-token.testpypi "${{ secrets.TESTPYPI_TOKEN }}"
226+
else
227+
poetry config pypi-token.pypi "${{ secrets.PYPI_TOKEN }}"
228+
fi
229+
- name: Publish
230+
shell: bash
231+
run: |
232+
if [ "${{ steps.target.outputs.name }}" = "testpypi" ]; then
233+
poetry publish -r testpypi
234+
else
235+
poetry publish
236+
fi
237+
```
238+
239+
- ๋ฌธ์„œํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ(๊ฐœ๋ฐœ์ž์šฉ):
240+
- [ ] ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค/๊ฐœ๋ฐœ ํƒœ๊ทธ ํ‘œ๊ธฐ ๊ทœ์น™์„ ํŒ€ ์ปจ๋ฒค์…˜์œผ๋กœ ๊ณ ์ •(`-dev.N`, `-alpha.N`, `-beta.N`, `-rc.N`).
241+
- [ ] ์ •์‹ ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ(`vX.Y.Z`)๋งŒ PyPI๋กœ ๊ฒŒ์‹œ, ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ๋Š” TestPyPI๋กœ ๊ฒŒ์‹œ.
242+
- [ ] ๋กœ์ปฌ ์Šค๋ƒ…์ƒท์€ ๋ฐฐํฌ ๊ธˆ์ง€, ํ•„์š” ์‹œ `poetry version "X.Y.Z.devN"`๋กœ ์ผ์‹œ ๋ฒ„์ „ ์ง€์ • ํ›„ ๋นŒ๋“œ.
243+
- [ ] ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์€ `strict=true`๋กœ ์œ ์ง€ํ•ด ํƒœ๊ทธ ์—†๋Š” ๋นŒ๋“œ๊ฐ€ CI์—์„œ ํ†ต๊ณผํ•˜์ง€ ์•Š๋„๋ก ํ•จ.
244+
124245
---
125246

126247
### ์˜ต์…˜ D: Poetry ํ˜ธํ™˜(ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด), ํƒœ๊ทธโ†’PEP 440 ์ •๊ทœํ™”
@@ -178,6 +299,122 @@ jobs:
178299
- `pykis/__env__.py`๋Š” `importlib.metadata.version()` ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ์ˆœํ™”
179300
- ํƒœ๊ทธ ์—†๋Š” ๋นŒ๋“œ๋Š” ๋ฆด๋ฆฌ์Šค ๋ฐฐํฌ ๊ธˆ์ง€, ํ•„์š”์‹œ ํ”„๋ฆฌ๋ทฐ ๋นŒ๋“œ ๊ทœ์น™ ๋ฌธ์„œํ™”
180301

302+
#### ๋น„ํƒœ๊ทธ ์ปค๋ฐ‹ ๋ฒ„์ „ ์ •์ฑ… (์˜ˆ์‹œ)
303+
- ์›์น™: ํƒœ๊ทธ๊ฐ€ ์—†๋Š” ์ปค๋ฐ‹์€ PyPI ์ •์‹ ๋ฐฐํฌ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฉฐ, ๋‚ด๋ถ€ ๊ฒ€์ฆ/์•„ํ‹ฐํŒฉํŠธ ์—…๋กœ๋“œ๋งŒ ์ˆ˜ํ–‰.
304+
- `main` ๋ธŒ๋žœ์น˜:
305+
- ๊ธฐ์ค€ ๋ฒ„์ „: ์ตœ๊ทผ ํƒœ๊ทธ `vX.Y.Z`๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ `X.Y.Z.devN` (N = ์ตœ๊ทผ ํƒœ๊ทธ ์ดํ›„ ์ปค๋ฐ‹ ์ˆ˜)
306+
- ์˜ˆ: ์ตœ๊ทผ ํƒœ๊ทธ `v2.2.0`, ์ปค๋ฐ‹ ์ˆ˜ 5 โ†’ `2.2.0.dev5`
307+
- ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature/*):
308+
- ๊ธฐ์ค€ ๋ฒ„์ „: ์ตœ๊ทผ ํƒœ๊ทธ `X.Y.Z.dev<runNumber>-<shortSHA>` (๋‚ด๋ถ€ ์‹๋ณ„ ๋ชฉ์ , PyPI ์—…๋กœ๋“œ ๊ธˆ์ง€)
309+
- ์˜ˆ: `2.2.0.dev143-abc1234`
310+
- ์•ผ๊ฐ„/์Šค๋ƒ…์ƒท(nightly):
311+
- ๊ธฐ์ค€ ๋ฒ„์ „: `X.Y.Z.dev<YYYYMMDDHH>` (๋นŒ๋“œ ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜)
312+
- ์˜ˆ: `2.2.0.dev20251220`
313+
314+
์ƒ˜ํ”Œ CI (๋น„ํƒœ๊ทธ push ์‹œ dev ๋ฒ„์ „ ์ ์šฉ):
315+
316+
```yaml
317+
jobs:
318+
build-dev:
319+
if: startsWith(github.ref, 'refs/heads/') && !startsWith(github.ref, 'refs/tags/v')
320+
runs-on: ubuntu-latest
321+
steps:
322+
- uses: actions/checkout@v4
323+
- uses: actions/setup-python@v5
324+
with: { python-version: '3.11' }
325+
- name: Install Poetry
326+
run: pipx install poetry
327+
- name: Compute dev version from latest tag
328+
shell: bash
329+
run: |
330+
tag="$(git describe --tags --abbrev=0 --match 'v*' 2>/dev/null || echo 'v0.0.0')"
331+
base="${tag#v}"
332+
count="$(git rev-list "$tag"..HEAD --count 2>/dev/null || echo 0)"
333+
pep="${base}.dev${count}"
334+
echo "Dev version: $pep"
335+
poetry version "$pep"
336+
- name: Install deps
337+
run: poetry install --no-interaction --with=dev
338+
- name: Build (artifact only)
339+
run: poetry build
340+
- name: Upload artifacts
341+
uses: actions/upload-artifact@v4
342+
with:
343+
name: python-kis-dev-dist
344+
path: dist/*
345+
```
346+
347+
๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์šฉ ์˜ˆ์‹œ(๊ฐ„๋‹จํ•œ ์‹๋ณ„์ž ํฌํ•จ):
348+
349+
```yaml
350+
- name: Compute dev version with branch+sha
351+
shell: bash
352+
run: |
353+
tag="$(git describe --tags --abbrev=0 --match 'v*' 2>/dev/null || echo 'v0.0.0')"
354+
base="${tag#v}"
355+
runnum="${GITHUB_RUN_NUMBER}"
356+
sha="$(git rev-parse --short HEAD)"
357+
pep="${base}.dev${runnum}-${sha}"
358+
poetry version "$pep"
359+
```
360+
361+
์•ผ๊ฐ„/์Šค๋ƒ…์ƒท ๋ฒ„์ „ ์˜ˆ์‹œ(ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜):
362+
363+
```yaml
364+
- name: Compute nightly dev version
365+
shell: bash
366+
run: |
367+
tag="$(git describe --tags --abbrev=0 --match 'v*' 2>/dev/null || echo 'v0.0.0')"
368+
base="${tag#v}"
369+
ts="$(date +%Y%m%d%H%M)"
370+
pep="${base}.dev${ts}"
371+
poetry version "$pep"
372+
```
373+
374+
#### ํ”„๋ฆฌ๋ทฐ ๋นŒ๋“œ ๊ทœ์น™ (์˜ˆ์‹œ)
375+
- ์›์น™: ํ”„๋ฆฌ๋ทฐ๋Š” ์ •์‹ PyPI๊ฐ€ ์•„๋‹Œ TestPyPI๋กœ๋งŒ ๋ฐฐํฌ.
376+
- ๋ฒ„์ „ ํ‘œ๊ธฐ: ๋ฆด๋ฆฌ์Šค ํ›„๋ณด/๋ฒ ํƒ€/์•ŒํŒŒ ํ˜•ํƒœ ์‚ฌ์šฉ(PEP 440), ์˜ˆ: `X.Y.Zrc1`, `X.Y.Zb2`, `X.Y.Za1`.
377+
- ํƒœ๊ทธ ๊ธฐ์ค€์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๋ฒ ํƒ€ ๋ฒˆํ˜ธ๋ฅผ CI ๋Ÿฌ๋‹ ๋„˜๋ฒ„๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€.
378+
379+
์ƒ˜ํ”Œ CI (๋น„ํƒœ๊ทธ ํ”„๋ฆฌ๋ทฐ, TestPyPI ๊ฒŒ์‹œ):
380+
381+
```yaml
382+
jobs:
383+
preview:
384+
if: startsWith(github.ref, 'refs/heads/') && !startsWith(github.ref, 'refs/tags/v')
385+
runs-on: ubuntu-latest
386+
steps:
387+
- uses: actions/checkout@v4
388+
- uses: actions/setup-python@v5
389+
with: { python-version: '3.11' }
390+
- name: Install Poetry
391+
run: pipx install poetry
392+
- name: Set preview version (beta)
393+
shell: bash
394+
run: |
395+
tag="$(git describe --tags --abbrev=0 --match 'v*' 2>/dev/null || echo 'v0.0.0')"
396+
base="${tag#v}"
397+
pep="${base}b${GITHUB_RUN_NUMBER}"
398+
echo "Preview version: $pep"
399+
poetry version "$pep"
400+
- name: Install deps
401+
run: poetry install --no-interaction --with=dev
402+
- name: Build
403+
run: poetry build
404+
- name: Configure TestPyPI
405+
run: |
406+
poetry config repositories.testpypi https://test.pypi.org/legacy/
407+
poetry config pypi-token.testpypi "${{ secrets.TESTPYPI_TOKEN }}"
408+
- name: Publish to TestPyPI
409+
run: poetry publish -r testpypi
410+
```
411+
412+
๋ฌธ์„œํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ(๊ถŒ์žฅ):
413+
- [ ] `main`/๊ธฐ๋Šฅ/์•ผ๊ฐ„ ๋นŒ๋“œ๋ณ„ ๋ฒ„์ „ ํ‘œ๊ธฐ ๊ทœ์น™ ๊ณ ์ •(์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜ ์„ ํƒ)
414+
- [ ] ๋น„ํƒœ๊ทธ ๋นŒ๋“œ๋Š” PyPI ๋น„๊ณต๊ฐœ(๊ธˆ์ง€), ์•„ํ‹ฐํŒฉํŠธ ์—…๋กœ๋“œ ๋Œ€์ƒ๋งŒ ๋ช…์‹œ
415+
- [ ] ํ”„๋ฆฌ๋ทฐ๋Š” TestPyPI๋กœ ๊ฒŒ์‹œํ•˜๊ณ  ํ† ํฐ/๋ ˆํฌ ์„ค์ •์„ ๋ณด์•ˆ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ
416+
- [ ] ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ฆด๋ฆฌ์Šค์™€์˜ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด pre-release ๋ฒˆํ˜ธ(bN/aN/rcN) ์ •์ฑ… ๋ช…ํ™•ํ™”
417+
181418
## ๊ตฌํ˜„ ๊ฐ€์ด๋“œ
182419

183420
### A์•ˆ (setuptools-scm ์ „ํ™˜) ๊ตฌํ˜„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
@@ -186,6 +423,9 @@ jobs:
186423
- [ ] `tool.poetry.version` ์ œ๊ฑฐ(๋˜๋Š” ๋ฌธ์„œํ™”: ๊ด€๋ฆฌ ๋Œ€์ƒ ์•„๋‹˜)
187424
- [ ] ๋ฐฐํฌ ์ „ `git tag` ๊ฐ•์ œ
188425

426+
์ถ”๊ฐ€(๋นŒ๋“œ ๊ฒฝ๋กœ ๋ช…์‹œ):
427+
- [ ] ๋นŒ๋“œ๋Š” `python -m build`(PEP 517)๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ , `poetry build`๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
428+
189429
์ƒ˜ํ”Œ ์ฝ”๋“œ(`pykis/__env__.py`):
190430
```python
191431
try:
@@ -229,8 +469,32 @@ PY
229469

230470
## FAQ
231471
- Q: Poetry์˜ `tool.poetry.version`์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
232-
- A: ๋ฐฐํฌ ๋ฒ„์ „์€ `[project]/setuptools` ๊ธฐ์ค€์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ˜ผ๋™ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ œ๊ฑฐ ๋˜๋Š” ๋ฌธ์„œ๋กœ ๋น„๊ด€๋ฆฌ ํ•„๋“œ์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
472+
- A: ๋ฐฐํฌ ๋ฒ„์ „์€ `[project]/setuptools` ๊ธฐ์ค€์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ˜ผ๋™ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ œ๊ฑฐ ๋˜๋Š” ๋ฌธ์„œ๋กœ ๋น„๊ด€๋ฆฌ ํ•„๋“œ์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ C์—์„œ๋Š” `version = "0.0.0"` placeholder๋งŒ ๋‚จ๊ธฐ๊ณ  `poetry-dynamic-versioning`์ด ํƒœ๊ทธ๋ฅผ ์ฃผ์ž…ํ•˜๋„๋ก ํ•˜๋ฉฐ, `[tool.setuptools.dynamic]`์„ ์ œ๊ฑฐํ•ด ์ค‘๋ณต ๊ฒฝ๋กœ๋ฅผ ์—†์•ฑ๋‹ˆ๋‹ค.
233473
- Q: ํƒœ๊ทธ ์—†์ด ๋กœ์ปฌ์—์„œ ๋ฒ„์ „์€?
234-
- A: A์•ˆ์€ `setuptools_scm`๊ฐ€ `0.0.0+dirty`/`+devN` ํ˜•์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. B์•ˆ์€ `24+dev` ๋“ฑ ๊ฐœ๋ฐœ ํ‘œ์‹ ์œ ์ง€.
474+
- A: A์•ˆ์€ `setuptools_scm`๊ฐ€ `0.0.0+dirty`/`+devN` ํ˜•์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. B์•ˆ์€ `24+dev` ๋“ฑ ๊ฐœ๋ฐœ ํ‘œ์‹ ์œ ์ง€. ์˜ต์…˜ C๋Š” `strict=true`์ผ ๋•Œ ํƒœ๊ทธ๊ฐ€ ์—†์œผ๋ฉด ์‹คํŒจํ•˜๋ฏ€๋กœ, ๋กœ์ปฌ ์Šค๋ƒ…์ƒท์ด ํ•„์š”ํ•˜๋ฉด ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ(`vX.Y.Z-dev.N`)๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ผ์‹œ์ ์œผ๋กœ `poetry version "X.Y.Z.devN"`๋กœ ์ง€์ •(์ปค๋ฐ‹ ๊ธˆ์ง€)ํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ์—์„œ๋งŒ `strict=false`๋กœ ๋‚ฎ์ถฐ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
235475
- Q: ๋Ÿฐํƒ€์ž„์—์„œ `__version__`์€?
236-
- A: ๋ฐฐํฌ ํŒจํ‚ค์ง€ ์„ค์น˜ ์‹œ ๋ฐฐํฌ ๋ฉ”ํƒ€์—์„œ ์ฝ์€ ์ •ํ™•ํ•œ ๋ฒ„์ „์œผ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
476+
- A: ๋ฐฐํฌ ํŒจํ‚ค์ง€ ์„ค์น˜ ์‹œ ๋ฐฐํฌ ๋ฉ”ํƒ€์—์„œ ์ฝ์€ ์ •ํ™•ํ•œ ๋ฒ„์ „์œผ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ C์—์„œ๋Š” `importlib.metadata.version("python-kis")`๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฃผ์ž… ๋ฒ„์ „๊ณผ ๋™์ผํ•˜๋ฉฐ, `__env__.py` placeholder ์—†์ด๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
477+
478+
- Q: ์™œ `[tool.poetry].version`์„ ์ œ๊ฑฐํ•˜๋ฉด `poetry build`๊ฐ€ ์‹คํŒจํ•˜๋‚˜์š”?
479+
- A: Poetry๋Š” ๋นŒ๋“œ ์‹œ ๋ฒ„์ „ ํ•„๋“œ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ต์…˜ A(์ˆœ์ˆ˜ `setuptools-scm`)๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ๋นŒ๋“œ๋ฅผ `python -m build`๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ, Poetry๋กœ ๋นŒ๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ์˜ต์…˜ C(ํ”Œ๋Ÿฌ๊ทธ์ธ) ๋˜๋Š” ์˜ต์…˜ D(CI์—์„œ `poetry version` ์ฃผ์ž…)๋กœ ๋ฒ„์ „์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ C๋Š” `version = "0.0.0"` placeholder๋ฅผ ๋‘๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํƒœ๊ทธ๋ฅผ ์ฝ์–ด ํ•„๋“œ๋ฅผ ์ฑ„์šฐ๋ฏ€๋กœ ๋นŒ๋“œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.
480+
481+
- Q: ๊ถŒ์žฅ Git ํƒœ๊ทธ ํ‘œ๊ธฐ ๊ทœ์น™์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
482+
- A: ์ •์‹ ๋ฆด๋ฆฌ์Šค๋Š” `vX.Y.Z`๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค๋Š” `vX.Y.Z-rc.N`, `-beta.N`, `-alpha.N`, ๊ฐœ๋ฐœ ์Šค๋ƒ…์ƒท์€ `vX.Y.Z-dev.N` ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ C์—์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด `style="pep440"`๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜์—ฌ `X.Y.Z`, `X.Y.ZrcN`, `X.Y.ZbN`, `X.Y.ZaN`, `X.Y.Z.devN`์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ D๋Š” CI ์Šคํฌ๋ฆฝํŠธ๋กœ ๋™์ผํ•œ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
483+
484+
- Q: ๋น„ํƒœ๊ทธ ์ปค๋ฐ‹์˜ ๋ฒ„์ „์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?
485+
- A: ํƒœ๊ทธ ์—†๋Š” ์ปค๋ฐ‹์€ PyPI ์ •์‹ ๋ฐฐํฌ ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ต์…˜ D ์˜ˆ์‹œ ์ •์ฑ…์„ ๋”ฐ๋ผ `main`์€ `X.Y.Z.devN`(์ตœ๊ทผ ํƒœ๊ทธ ์ดํ›„ ์ปค๋ฐ‹ ์ˆ˜), ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋Š” `X.Y.Z.dev<runNumber>-<shortSHA>`, ์•ผ๊ฐ„ ๋นŒ๋“œ๋Š” `X.Y.Z.dev<YYYYMMDDHHMM>`๋กœ ํ‘œ๊ธฐํ•˜๊ณ , ์•„ํ‹ฐํŒฉํŠธ๋งŒ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ C์—์„œ๋Š” `strict=true`๋ฉด CI์—์„œ ์ฆ‰์‹œ ์‹คํŒจํ•˜๋„๋ก ๋‘๊ณ , ํ•„์š” ์‹œ ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋กœ์ปฌ ์ „์šฉ์œผ๋กœ `poetry version "X.Y.Z.devN"`์„ ์ฃผ์ž…ํ•œ ๋’ค TestPyPI/์•„ํ‹ฐํŒฉํŠธ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
486+
487+
- Q: ๋กœ์ปฌ์—์„œ ์˜ต์…˜ A ๋นŒ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋‚˜์š”?
488+
- A: `pipx install build` ํ›„ `python -m build`(๋˜๋Š” `pipx run build`)๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ํƒœ๊ทธ๊ฐ€ ์—†์œผ๋ฉด `setuptools-scm`๊ฐ€ `+dirty`/`+devN` ๋ฒ„์ „์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฐ์ถœ๋ฌผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฒ„์ „์„ ํ™•์ธํ•ด ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•˜์„ธ์š”. ์˜ต์…˜ C์—์„œ๋Š” ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ๋ฅผ ๋งŒ๋“  ๋’ค `poetry build`๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ฒ„์ „์„ ์ฃผ์ž…ํ•˜๋ฏ€๋กœ `dist/*`์˜ `Version:` ํ•„๋“œ๊ฐ€ ํƒœ๊ทธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
489+
490+
- Q: ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ์˜ ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋‚˜์š”?
491+
- A: `dist/*.whl`์˜ `METADATA` ํŒŒ์ผ์„ ์—ด์–ด `Version:` ๊ฐ’์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์ž„์‹œ ๊ฐ€์ƒํ™˜๊ฒฝ์— ์„ค์น˜ ํ›„ `python -c "import importlib.metadata as m; print(m.version('python-kis'))"`๋กœ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ C๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋นŒ๋“œ ์‹œ์ ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋ฏ€๋กœ `Version:` ๊ฐ’์ด Git ํƒœ๊ทธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
492+
493+
- Q: ์ฝ”๋“œ์—์„œ ๋ฒ„์ „ ๋ฌธ์ž์—ด์„ ์•ˆ์ •์ ์œผ๋กœ ์ฝ๋Š” ๋ฐฉ๋ฒ•์€?
494+
- A: ์„ค์น˜๋œ ๋ฐฐํฌ์—์„œ๋Š” `importlib.metadata.version('python-kis')`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์‹คํ–‰์—์„œ ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ฒ„์ „์ด ํ•„์š”ํ•˜๋ฉด `setuptools_scm.get_version()`์„ ๋ณด์กฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์‹คํŒจ ์‹œ `0.0.0+unknown` ๋“ฑ์˜ ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ C๋ฅผ ์„ ํƒํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์€ ํ•ญ์ƒ ๋ฐฐํฌ ๋ฉ”ํƒ€์— ๊ธฐ๋ก๋œ ๋ฒ„์ „์„ ๊ทธ๋Œ€๋กœ ์ฝ์œผ๋ฏ€๋กœ `__env__.py` placeholder ์—†์ด๋„ ๋™์ผ ๋™์ž‘์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
495+
496+
- Q: ๋ฒ„์ „ ์†Œ์Šค ์ถฉ๋Œ์„ ํ”ผํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?
497+
- A: ๋‹จ์ผ ๊ฒฝ๋กœ๋งŒ ์œ ์ง€ํ•˜์„ธ์š”. ์˜ต์…˜ C๋ฅผ ์„ ํƒํ•˜๋ฉด `[tool.poetry].version`์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  `[tool.setuptools.dynamic]`(setuptools ๊ฒฝ๋กœ)์™€ `__env__.py` placeholder๋Š” ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ A๋ฅผ ์„ ํƒํ•˜๋ฉด `[project] dynamic`+`setuptools-scm`๋งŒ ๋‚จ๊ธฐ๊ณ  Poetry ๋นŒ๋“œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ D๋ฅผ ์„ ํƒํ•˜๋ฉด CI์—์„œ๋งŒ `poetry version`์„ ์„ค์ •ํ•˜์—ฌ ์ค‘๋ณต ์„ค์ •์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
498+
499+
- Q: ์˜ต์…˜ C(ํ”Œ๋Ÿฌ๊ทธ์ธ) ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€?
500+
- A: ํƒœ๊ทธ๊ฐ€ ๋‹จ์ผ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. `strict=true`๋กœ ํƒœ๊ทธ ์—†๋Š” ๋นŒ๋“œ๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค/๊ฐœ๋ฐœ ํƒœ๊ทธ(`-dev.N/-alpha.N/-beta.N/-rc.N`)๋Š” TestPyPI๋กœ๋งŒ ๊ฒŒ์‹œํ•˜์„ธ์š”. `[build-system]`์—์„œ setuptools ๋™์  ๋ฒ„์ „ ์„ค์ •์„ ์ œ๊ฑฐํ•ด ์ถฉ๋Œ์„ ๋ง‰๊ณ , ๋กœ์ปฌ ์Šค๋ƒ…์ƒท์ด ํ•„์š”ํ•˜๋ฉด ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ `poetry version "X.Y.Z.devN"`๋กœ ์ž„์‹œ ๋ฒ„์ „์„ ์ง€์ •ํ•˜๋˜ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒ„์ „์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ณ ์ •ํ•˜๊ณ (`poetry self add poetry-dynamic-versioning==<pin>`), CI์™€ ๋กœ์ปฌ ์„ค์ •์ด ๋™์ผํ•˜๋„๋ก `pyproject.toml`์—๋งŒ ์„ค์ •์„ ๋‘” ๋’ค `.lock`/`poetry self show`๋กœ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

โ€Žpyproject.tomlโ€Ž

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ include = ["pykis"]
7070
exclude = ["tests"]
7171

7272
[tool.poetry]
73-
version = "2.1.6"
7473
packages = [
7574
{ include = "pykis", from = "." },
7675
]

0 commit comments

Comments
ย (0)