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### ๊ตฌ์ฑ ์์
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
191431try:
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`๋ก ํ์ธํ๋ ์ ์ฐจ๋ฅผ ์ถ๊ฐํ์ธ์.
0 commit comments