macOS ํ ์ค ๋ช ๋ น์ผ๋ก Node.js ยท Java ยท Python ยท Rust ยท Go ์ปดํ์ผ๋ฌ๋ฅผ ํต์งธ๋ก ์ค์น
git clone๋, ์๋ ์ค์น๋ ํ์ ์์ต๋๋ค. ํฐ๋ฏธ๋์ ํ ์ค ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋.
curl -fsSL --proto '=https' --proto-redir '=https' --tlsv1.2 \
https://raw.githubusercontent.com/amosQP/langtoolchain/main/install.sh | sh
โ ๏ธ macOS ์ ์ฉ, ๊ฐ์ธ ํด๋ง์ ๋๋ค. Linux/Windows(WSL ํฌํจ) ์ง์ ๊ณํ์ด ์๊ณ , ๋ฒ์ฉ ํ๋ก๋์ ๋๊ตฌ๋ก ๋ง๋ ๊ฒ ์๋๋ผ ์ ๊ฐ์ธ Mac ์ํฌํ๋ก์ฐ์ ๋ง์ถฐ ๋ง๋ ๋๊ตฌ์ ๋๋ค โ ๋ค๋ฅธ ํ๊ฒฝ์์์ ๋์์ด๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.
์ Mac๋ง๋ค Homebrewยทasdf ์ค์น, ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ, .zshrc ์๋ณด๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ ์ง๊ฒจ์์ ๋ง๋ค์์ต๋๋ค. ์ด์ ๋ ํ ์ค์ด๋ฉด ๋ฉ๋๋ค. Homebrewยทasdf ์ค์น๋ถํฐ ์ธ์ด ์ ํ, ์
ธ ์ค์ ๊น์ง ์ ๋ถ ์๋์
๋๋ค.
- ๐บ Homebrew ์์ด๋ OK โ ์์ผ๋ฉด ๊ณต์ ์คํฌ๋ฆฝํธ๋ก ์๋ ์ค์น (sudo ๋น๋ฐ๋ฒํธ๋ง ์ง์ ์ ๋ ฅ)
- โ๏ธ ์ฒดํฌ๋ฐ์ค ๊ฐ์ ๋ํํ ์ค์น โ ์ธ์ด๋ณ๋ก ์ค์น ์ฌ๋ถ์ ๋ฒ์ ์ ํ์ธํ๊ณ ๊ณจ๋ผ์ ์ค์น
- ๐
curl | sh์์ ์ง์ โ ๋ก์ปฌ์ ์๋ฌด๊ฒ๋ ์์ด๋ ์๊ฒฉ ์ ์ฅ์๋ฅผ ์์์ cloneํด์ ์คํ - ๐ ์ ์ญ or ๋๋ ํ ๋ฆฌ๋ณ ๋ฒ์ ๊ณ ์ โ ์์คํ ์ ์ฒด ๊ธฐ๋ณธ๊ฐ์ผ๋ก๋, ํน์ ํ๋ก์ ํธ์๋ง๋ ์์ ๋กญ๊ฒ
- ๐ ๊น๋ํ ์ ๊ฑฐ โ ์ค์นํ ๊ฑด ์ ๋ถ ๋๋๋ฆด ์ ์์ (
.bak๋ฐฑ์ ๊น์ง ๋จ๊น) - ๐ฅ๏ธ POSIX sh ํธํ โ macOS ๊ธฐ๋ณธ ์
ธ(
/bin/sh)์์๋ ๊ทธ๋๋ก ๋์, bash ํน์๋ฌธ๋ฒ ์์
- ๋น ๋ฅธ ์์
- ์ฌ์ ์๊ตฌ์ฌํญ
- ์ค์น/์ ๊ฑฐ๋๋ ๊ฒ
- ์ํคํ ์ฒ
- ์๋ ค์ง ํ๊ณ / ๊ธฐ์ ์ ํ๊ณ
- ๊ธฐ์ฌํ๊ธฐ
- License
curl -fsSL --proto '=https' --proto-redir '=https' --tlsv1.2 \
https://raw.githubusercontent.com/amosQP/langtoolchain/main/install.sh | sh๋ก์ปฌ์ ์ด๋ฏธ ํด๋ก ํด๋๋ค๋ฉด:
git clone https://github.com/amosQP/langtoolchain.git && cd langtoolchain
./install.sh์ธ์ด๋ณ ์ค์น ์ฌ๋ถ(โ/โ๋ก ๊ณ ๋ฅด๊ณ Enter๋ก ํ์ , ์ซ์ ํค๋ก ๋ฐ๋ก ์ ํ๋ ๊ฐ๋ฅ)์ ๋ฒ์ ์ ํ์ธํ ๋ค, ๋ง์ง๋ง ํ์ธ์ ๊ฑฐ์ณ ์ค์น๋ฅผ ์์ํฉ๋๋ค. ๊ฐ ์ง๋ฌธ์ ๋ตํ๋ฉด ๊ทธ ์๋ฆฌ์์ ํ ์ค๋ก ์ ํ์ ๋ค์ ์ง๋ฌธ์ผ๋ก ๋์ด๊ฐ๋๋ค โ ์๋๋ ์ค์ ์คํ ํ๋ฉด์ ๋๋ค.
== Select languages to install ==
โ Install nodejs (node)? Yes
โ Version: lts (default)
โ Also install pnpm (companion to nodejs)? Yes
โ Version: 10.33.0 (default)
โ Install java (java)? No
...
== Install list ==
nodejs lts
pnpm 10.33.0
python 3.12.13
rust 1.94.0
golang 1.26.1
โ Pin these versions: Globally
โ Install? Yes
๋ง์ง๋ง ํ๋กฌํํธ๋ ์ด๋ฒ์ ์ค์นํ ๋ฒ์ ์ ์ ์ญ(
~/.tool-versions)์ ๊ณ ์ ํ ์ง, ์ง๊ธ ๋๋ ํ ๋ฆฌ์๋ง ๋ก์ปฌ๋ก ๊ณ ์ ํ ์ง ๊ณ ๋ฆ ๋๋ค(asdf์ ํ์ค ๋ฉ์ปค๋์ฆ ๊ทธ๋๋ก โ nvm์.nvmrc๊ฐ์ ๊ฑธ ์ธ์ด ์๊ด์์ด.tool-versionsํ๋๋ก ํต์ผํ ๊ฒ๋ฟ์ ๋๋ค).๋๋ฐ ๋๊ตฌ(pnpm/gradle) ์ง๋ฌธ์ ๊ทธ ๋ถ๋ชจ ์ธ์ด(nodejs/java)๋ฅผ ์๋ฝํ์ ๋๋ง ๋ฐ๋ผ ๋์ต๋๋ค โ ์ ์์์์ java๋ฅผ
n์ผ๋ก ๊ฑฐ์ ํ๋ gradle ์ง๋ฌธ ์์ฒด๊ฐ ์ ๋จ๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ต์
ํ๋๊ทธ (curl | sh -s -- <์ต์
> ํํ๋ก ์ ๋ฌ ๊ฐ๋ฅ)
| ํ๋๊ทธ | ๋์ | ๋์ |
|---|---|---|
--all |
install | ์ธ์ด ์ ํ ํ๋ฉด ์์ด .tool-versions์ ์๋ ๊ฑธ ์ ๋ถ ์ค์น |
--yes |
install / uninstall | ๋ง์ง๋ง ํ์ธ ํ๋กฌํํธ๋ฅผ ๊ฑด๋๋ |
--dry-run |
install / uninstall | ์ค์ ๋ก ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์๊ณ , ๋ญ ํ ์ง๋ง ์ถ๋ ฅ |
--local / --local=<dir> |
install | ์ ์ญ ๋์ ํ์ฌ(๋๋ ์ง์ ํ) ๋๋ ํ ๋ฆฌ์๋ง ๋ฒ์ ๊ณ ์ |
์ฌ๋ฌ ๊ฐ๋ฅผ ์กฐํฉํ ์ ์์ต๋๋ค: curl ... | sh -s -- --all --yes --dry-run์ฒ๋ผ.
ํฐ๋ฏธ๋(tty)์ด ์๋ ํ๊ฒฝ(CI ๋ฑ)์์ ์คํํ๋ฉด ์๋์ผ๋ก --all์ฒ๋ผ ๋์ํฉ๋๋ค โ ์
๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๋ค ๋ฉ์ถ์ง ์์ต๋๋ค.
| ํ์ํ ๊ฒ | ์์ผ๋ฉด? |
|---|---|
| macOS | ์ด ๋๊ตฌ๋ macOS ์ ์ฉ์ ๋๋ค |
git (์๊ฒฉ ์ค์น ์) |
Xcode Command Line Tools์ ๊ธฐ๋ณธ ํฌํจ |
| ์์ผ๋ฉด ์ค์น๊ธฐ๊ฐ ์์์ ์ค์นํฉ๋๋ค (sudo ๋น๋ฐ๋ฒํธ๋ ์ง์ ์ ๋ ฅ ํ์) | |
์์ผ๋ฉด brew install asdf๋ก ์์์ ์ค์นํฉ๋๋ค |
.tool-versions์ ์ ์๋ ๊ธฐ๋ณธ ์ธ์ด/๋ฒ์ โ ์ค์น ํ๋ฉด์์ ๊ฐ๋ณ์ ์ผ๋ก ์ผ๊ณ ๋๊ฑฐ๋ ๋ฒ์ ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๋๋ฐ ๋๊ตฌ(pnpm/gradle)๋ ๊ฐ๊ฐ ๊ทธ ๋ถ๋ชจ ์ธ์ด๋ฅผ ์ค์นํ ๋๋ง ๋ฌผ์ด๋ณด๋ ์ ํ ์ฌํญ์
๋๋ค.
| ์ธ์ด / ๋๋ฐ ๋๊ตฌ | ๊ธฐ๋ณธ ๋ฒ์ |
|---|---|
| ๐ฉ Node.js | lts |
| ย ย โ pnpm (๋๋ฐ) | 10.33.0 |
| โ Java (Temurin) | temurin-25.0.2+10.0.LTS |
| ย ย โ gradle (๋๋ฐ) | 9.4.1 |
| ๐ Python | 3.12.13 |
| ๐ฆ Rust | 1.94.0 |
| ๐น Go | 1.26.1 |
Python ์ปดํ์ผ์ ํ์ํ Homebrew ํจํค์ง(openssl, readline, sqlite3, xz, zlib, tcl-tk)๋ ํจ๊ป ์ค์น๋ฉ๋๋ค.
์ด ๋๊ตฌ๋ ์ ์ธ์ด(+๋๋ฐ ๋๊ตฌ)์ ๊ทธ๊ฑธ ์ํ Homebrew ํจํค์ง 6๊ฐ๋ง ๊ฑด๋๋ฆฝ๋๋ค โ ์ด๋ฏธ ์๊ฑฐ๋ ์์ผ๋ก
์ค์นํ ๋ค๋ฅธ brew ํจํค์ง, ์ด ๋๊ตฌ๊ฐ ๊น์ง ์์ ๋ค๋ฅธ asdf ํ๋ฌ๊ทธ์ธ์ install ์ชฝ์์๋ uninstall
์ชฝ์์๋ ์๋์ง ์์ต๋๋ค. uninstall์ langtoolchain์ด ์ค์นํ์ง ์์ asdf ํ๋ฌ๊ทธ์ธ ๊ฐ๊ฐ๋,
asdf ์์ฒด์ ~/.asdf/(asdf ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ) ์ ์ฒด ์ญ์ ๋ ๋ชจ๋ ์ค์น ์์ ์ค๋
์ท์ ๊ธฐ์ค์ผ๋ก
ํ๋จํฉ๋๋ค โ ๊ฐ๋ณ ํ๋ฌ๊ทธ์ธ์ด๋ ~/.asdf/ ์ ์ฒด๋ , ์ค์น ์์ ์ ์ด๋ฏธ ์์๋ค๋ ๊ฒ ํ์ธ๋๋ฉด(๋๋
ํ์ธํ ์ ์์ผ๋ฉด) ์ญ์ ๋ฅผ ๊ฑด๋๋ฐ๊ณ ๊ฒฝ๊ณ ๋ง ๋จ๊น๋๋ค โ ๋ค๋ฅธ asdf ํ๋ฌ๊ทธ์ธ์ด ์์ด๋ ๋ฌด์กฐ๊ฑด ํจ๊ป
์ง์์ง๋ ์์ ๋์๊ณผ ๋ค๋ฆ
๋๋ค. uninstall์ด phase ์ ์ฒด๋ฅผ ์๋ฌ ์์ด ๋ง์น๋ฉด ์ด ์ค์น ์์ ์ค๋
์ท
์์ฒด๋ ์ง์์ง๋๋ค โ ๋ค์ install์ด ๊ทธ ์์ ์ ์ค์ ์ํ๋ก ์ ๊ธฐ์ค์ ์ ์ก์ต๋๋ค.
โ ๏ธ ๋์ ๋ณ๊ฒฝ ์๋ด(m-13): ์ด ๋ณ๊ฒฝ ์ด์ ๋ฒ์ ์ผ๋ก ์ด๋ฏธ ์ค์นํด ๋ ์ํ์์ langtoolchain์ ์ ๋ฐ์ดํธ๋ง ํ ๊ฒฝ์ฐ, install ์์ ์ค๋ ์ท์ด ์์ผ๋ฏ๋ก uninstall์ ์คํํด๋ ์์ ์ ์ํด asdf ํ๋ฌ๊ทธ์ธ ๊ฐ๋ณ ์ญ์ ์~/.asdf/์ ์ฒด ์ญ์ ๊ฐ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํต๋ฉ๋๋ค(์ค์น ์ ๋ถํฐ ์๋ ์ํ์ธ์ง ํ๋จํ ๊ทผ๊ฑฐ๊ฐ ์๊ธฐ ๋๋ฌธ โ "๋ชจ๋ฅด๋ฉด ์ง์ฐ์ง ์๋๋ค"๋ ์์น). langtoolchain์ด ์ค์นํ ๋ฐํ์๊น์ง ํฌํจํด ์์ ํ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด, uninstall ์คํ ํ ํ๋ฉด์ ์๋ด๋๋ ๋๋กrm -rf ~/.asdf๋ฅผ ์ง์ ์คํํ์ธ์.
curl -fsSL --proto '=https' --proto-redir '=https' --tlsv1.2 \
https://raw.githubusercontent.com/amosQP/langtoolchain/main/uninstall.sh | sh์คํ ์ ํ ๋ฒ ํ์ธ์ ๋ฌผ์ผ๋ฉฐ(--yes๋ก ์๋ต ๊ฐ๋ฅ), --dry-run๋ ๋์ผํ๊ฒ ์ง์ํฉ๋๋ค. ์ค์น/์ ๊ฑฐ
ํ์๋ exec $SHELL๋ก ์ ์
ธ ์ธ์
์ ์ด์ด์ผ PATH ๋ฑ ์บ์๋ ์ํ๊ฐ ์์ ํ ์ฌ๋ผ์ง๋๋ค.
install.sh/uninstall.sh๊ฐ ๊ฐ๊ฐ ์ด๋ค phase๋ฅผ ์์๋๋ก ๊ฑฐ์น๋์ง, uninstall์ ์์ ์ฅ์น (์ค์น ์ ๋ถํฐ ์๋ asdf ์ํ๋ ์ ์ง์ด๋ค)๊ฐ ์ ํํ ์ด๋ ์ง์ ์์ ๊ฐ์ ํ๋์ง๋ฅผ ๋ค์ด์ด๊ทธ๋จ ์ผ๋ก ์ ๋ฆฌํด๋์ต๋๋ค โ docs/architecture.md.
- macOS ์ ์ฉ โ Linux/Windows ๋ฏธ์ง์.
- ์ธ์ด 5๊ฐ ๊ณ ์ โ Node.js/Java/Python/Rust/Go ์ธ ์ธ์ด๋ ์ฝ๋๋ฅผ ์ง์ ๊ณ ์ณ์ผ ์ถ๊ฐ ๊ฐ๋ฅ. ์์ asdf์ฒ๋ผ ์์ ํ๋ฌ๊ทธ์ธ์ ์์ ๋กญ๊ฒ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์์.
- ๋๋ฐ ๋๊ตฌ๋ nodejs/java/python ์ ๋ฟ โ pnpm(nodejs), gradle(java), uv(python, poetry ๋์ ์ฑํ โ decision-5) ์ธ ์ธ์ด๋ ๋๋ฐ ๋๊ตฌ ๊ฐ๋ ์ด ์์(Rust/Go๋ cargo/๋ชจ๋ ์์คํ ์ด ์ด๋ฏธ ๋ด์ฅ์ด๋ผ ํ์ ์๋ค๊ณ ํ๋จ). ์ธ์ด๋น ๋๋ฐ ๋๊ตฌ๋ ํญ์ 1๊ฐ๋ง ์ ์ํ๋ UX๋ผ poetry๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด "์ง์ ์ ๋ ฅ" ๊ฒฝ๋ก๋ก pinํ๊ฑฐ๋ ์ ์ฅ์ ๋ฐ์์ ๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํจ.
- ํต์ฌ ๋ชฉ์ ("์ปดํ์ผ๋ฌ ์ค์น")๋ณด๋ค ๋์ ๊ธฐ๋ฅ์ด ์์ โ ์ ์ญ/๋ก์ปฌ ๋ฒ์ ๊ณ ์ , ๋ํํ ์ ํ๊ธฐ๋ ์ฌ์ค asdf ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ผ ๋ถ๊ฐ ๊ธฐ๋ฅ. ํ ๋ฒ ๊ฒํ ๋ฅผ ๊ฑฐ์ณ "์ ์ง"๋ก ๊ฒฐ์ ํ๊ณ , ๊ฑท์ด๋ผ ๊ณํ์ ์์.
- Homebrew/asdf ์ธ ๋๊ตฌ์ฒด์ธ์ ์ง์ ๋์ ์๋ โ MacPorts(
/opt/local)๋ ๊ฒฝ๋ก ์์ฒด๊ฐ ๊ฒน์น์ง ์์ ํ์ผ ์ถฉ๋์ ์์ง๋ง, ๊ฐ์ ์ด๋ฆ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊น์๋ค๋ฉด rc ํ์ผ์์ ๋์ค์ ์์ฑ๋๋ ์ชฝ์ด ์ด๊ธด๋ค.mise์ฒ๋ผ.tool-versions๋ฅผ ์ง์ ์ฝ๊ณ ์์ฒด PATH ํ ์ผ๋ก ์ ธ์ ํ์ฑํํ๋ ๋๊ตฌ๋ ๋ ์ค์ง์ ์ธ ์ํ โ rc ํ์ผ์์ langtoolchain๋ณด๋ค ๋์ค์ ๋ก๋๋๋ฉด asdf shim์ ์กฐ์ฉํ ๊ฐ๋ฆด ์ ์์. ๋ ๋ค ๊ฐ์ง/๊ฒฝ๊ณ ๋ก์ง์ ์์. - ๋์ ๊ธฐ๋ณธ๊ฐ์ด asdf๊ฐ ์์ง ๋ชป ๋ฐ๋ผ์ก์ ์ต์ ๋ฒ์ ์ ์ ์ํ ์ ์์ โ ์ธ์ด ๋ฒ์ ๊ธฐ๋ณธ๊ฐ์ ์ธ์ด ๊ณต์ ์์ค(์: cpython ํ๊ทธ)์์ ์ค์๊ฐ์ผ๋ก ๊ฐ์ ธ์ค๋๋ฐ(m-12), asdf ํ๋ฌ๊ทธ์ธ์ด ๊ทธ ๋ฒ์ ์ ์์ง ์ง์ ์ ํ๋ฉด ์ค์น๊ฐ "version not installable"๋ก ์คํจํ ์ ์์(decision-12). m-15(์ค์ ์ค์น ๊ฐ๋ฅํ ๋ฒ์ ๋ชฉ๋ก ๊ธฐ๋ฐ ์ ํ UI)๊ฐ ์๋ฃ๋๋ฉด ์ ์ด์ asdf ๋ฏธ์ง์ ๋ฒ์ ์ ์ ํ์ง์๋ ์ ๋จ๊ฒ ๋์ด ๊ตฌ์กฐ์ ์ผ๋ก ํด์๋ ์์ .
์ด ์ ์ฅ์๊ฐ ์ค์ ๋ก ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ ์ง์ ๊ณผ, Homebrew/asdf ๊ฐ์ ์์ ๋๊ตฌ์ ์ ๋ขฐ๋ฅผ ์์ํ๊ฑฐ๋ ์ ์ฅ์๊ฐ ์ง์ ์๋ ์ ์๋ ์ง์ ์ ๊ตฌ๋ถํด ๋ช ์ํฉ๋๋ค. ์ง์ ๋ณ ์์ธ(ํ์ผ:๋ผ์ธ, ํ์ฌ ๊ฒ์ฆ ์์ค)๋ docs/download-points-inventory.md, ๊ฒ์ฆ ๊ธฐ๋ฒ ์์ฒด์ ์กฐ์ฌ๋ docs/download-integrity-techniques.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ด ์ ์ฅ์๊ฐ ์ง์ ๊ฒ์ฆํ๋ ์ง์
| ์ง์ | ๋ฐฉ์ |
|---|---|
install.sh/uninstall.sh์ self-clone |
ํ๋กํ ๋ธ๋์น ๋์ ๊ณ ์ ์ปค๋ฐ SHA๋ก pin โ ๋ธ๋์น๊ฐ ๊ฐ์ push๋ผ๋ ์ด๋ฏธ pin๋ ์ปค๋ฐ๋ง ๋ฐ์ |
Homebrew ๊ณต์ ์ค์น ์คํฌ๋ฆฝํธ(curl | bash) |
๊ณ ์ ์ปค๋ฐ์ผ๋ก pin + ์ด ํ๋ก์ ํธ๊ฐ ์ง์ ๊ณ์ฐํ SHA-256 ์ฒดํฌ์ฌ์ fetch ์งํ ๋์กฐ, ๋ถ์ผ์น ์ ์คํ ๊ฑฐ๋ถ |
์์/ํต์ ๋ฐ ์ง์ (์ด ์ ์ฅ์๊ฐ ์ง์ ๊ฒ์ฆํ์ง ์์)
| ์ง์ | ์์ ๋์ / ํต์ ๋ฐ์ธ ์ด์ |
|---|---|
brew install asdf, brew install <์์คํ
์์กด์ฑ 6๊ฐ> |
Homebrew ์์ฒด์ bottle ์๋ช /์ฒดํฌ์ฌ ์ฒด๊ณ์ ์์ |
asdf plugin add(asdf-nodejs/asdf-python ๋ฑ ํ๋ฌ๊ทธ์ธ ์์ค) |
asdf CLI(0.20.0)๊ฐ ์ปค๋ฐ ๊ณ ์ ์ ์ง์ํ์ง ์์ โ ๊ฒํ ํ ๋ฏธ๊ณ ์ ๊ฒฐ์ , ๋งค install ์คํ๋ง๋ค ๊ฐ ํ๋ฌ๊ทธ์ธ ์ ์ฅ์์ ์ต์ HEAD๋ก ๊ฐฑ์ ๋จ |
asdf install(์ค์ ์ธ์ด ๋ฐํ์ ๋ค์ด๋ก๋) |
๊ฐ asdf ํ๋ฌ๊ทธ์ธ ๋ด๋ถ ๋ก์ง โ ์ด ์ ์ฅ์๊ฐ ์ง์ ๊ด์ฌํ ์ ์์ |
๋ช ์์ ์ผ๋ก ๋ฒ์ ๋ฐ: GitHub ์ ์ฅ์/๊ณ์ ์์ฒด์ ํ์ทจ. ๊ณต๊ฒฉ์๊ฐ ์ ์ฅ์๋ ๋ฉ์ธํ ์ด๋ ๊ณ์ ์ ์์ ํ ์ฅ์ ํ๋ฉด install.sh์ ๋ฐํ ๊ณ ์ ์ปค๋ฐ SHA ์์ฒด๋ ํจ๊ป ๋ฐ๊ฟ ์ ์์ด, ์ pin๋ค๋ก๋ ๋ง์ ์ ์์ต๋๋ค. ์ด๊ฑด GitHub ์ชฝ ๊ณ์ ๋ ๋ฒจ ํต์ (๋ธ๋์น ๋ณดํธ ๊ท์น, ์๋ช ๋ ์ปค๋ฐ ์๊ตฌ, 2FA)์ ์์ญ์ด๋ฉฐ, ์ ธ ์ค์น ์คํฌ๋ฆฝํธ ํ๋๊ฐ ํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ํ๋จํด ์ด ๋ง์ผ์คํค์ ๋ฒ์ ๋ฐ์ผ๋ก ๋์ต๋๋ค.
- ๋ก์ปฌ shellspec์ ์ค์ Homebrew/asdf๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ โ
spec/์ 183๊ฐ ์์ ๋ ์ ๋ถ ์ค์ brew/asdf๋ช ๋ น์ ๋ชจํนํ๊ฑฐ๋DRY_RUN=true๋ก ์คํ๋๋๋ก ์ค๊ณ๋จ(์ง์ง ์ปดํ์ผ/์ค์น๋ ๋๋ฆฌ๊ณ ๊ฐ๋ฐ ๋จธ์ ์ ์ค์ผ์ํค๋ฏ๋ก). ๊ทธ๋์ "์ง์ง๋ก ์ค์น๊ฐ ๋๋๊ฐ" ์์ฒด๋ ๋ก์ปฌ ์ค์ํธ๊ฐ ๋ณด์ฅํ์ง ์๊ณ ,.github/workflows/e2e-verify.yml(GitHub ํธ์คํ macOS ๋ฌ๋, arm64+Intel)์ด ์ ์ผํ ์ค๊ธฐ๊ธฐ ๊ฒ์ฆ ๊ฒฝ๋ก์ โmain๋ธ๋์น์scripts/**/install.sh/uninstall.sh/.tool-versions๊ฐ ๋ฐ๋ ๋๋ง push/PR๋ก ์๋ ์คํ(๊ทธ ์ธ ์ปค๋ฐ์workflow_dispatch๋ก ์๋ ์คํ). - ํ์ดํ ํค TUI๋ ํ์ค ํฐ๋ฏธ๋ ๊ธฐ์ค์ผ๋ก๋ง ๊ฒ์ฆ โ
stty/dd๋ก raw ๋ชจ๋๋ฅผ ์ฝ๋lt_arrow_menu()๋expect๋ก ๊ตฌ๋ํ ์ค์ pty(๋ฐ ์ผ๋ฐ ํฐ๋ฏธ๋ ์ฑ)์์๋ ํ์ธํ์ง๋ง, ๋ชจ๋ ํฐ๋ฏธ๋ ์๋ฎฌ๋ ์ดํฐยท๋ฉํฐํ๋ ์(tmux/screen ๋ฑ)ยทSSH ๊ฒฝ์ ์ธ์ ์กฐํฉ๊น์ง ๋ค ๊ฒ์ฆํ์ง๋ ์์ โ ํ์ค 3๋ฐ์ดํธ ANSI ์ด์ค์ผ์ดํ(ESC [ A/B)๋ฅผ ๋ฒ์ด๋๋ ๋นํ์ค ํค ์ ์ก ๋ฐฉ์์์๋ ์์๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์์. curl | sh์ "๊ธฐ๋ณธ" ์๊ฒฉ clone ๊ฒฝ๋ก(์ง์ง GitHub ๋์)๋ ๋ก์ปฌ์์ ์ฌํํ๊ธฐ ์ด๋ ค์ โLANGTOOLCHAIN_REPO_URL/LANGTOOLCHAIN_BRANCHํ๊ฒฝ๋ณ์๋ก fork/๋ค๋ฅธ ๋ธ๋์น๋ฅผ ๊ฐ๋ฆฌ์ผ overrideํ๋ ๊ฒฝ๋ก ์์ฒด๋ TASK-117.6 ์ดํ ๋ก์ปฌ bare ์ ์ฅ์(file://)๋ฅผ ๋์์ผ๋กspec/repo_override_spec.sh๊ฐ ์ปค๋ฒํจ(pinned-fetch ๋ฉ์ปค๋์ฆ์ exact-ref ๋์๊น์ง ํฌํจ). ๋ค๋ง override ์์ด ๊ธฐ๋ณธ๊ฐ(๊ณ ์ ์ปค๋ฐ SHA, ์ค์ GitHub)์ ํ๋ ๊ฒฝ๋ก ์์ฒด๋ ์ฌ์ ํ ๋ก์ปฌ ์ค์ํธ ๋์์ด ์๋๋ฉฐ, ์ค์ curl | sh๋ก ์ด ์ ์ฅ์๋ฅผ ์ง์ ๋น๊ฒจ ๊ฒ์ฆํ ๊ฒ๊ณผ.github/workflows/e2e-verify.yml์no-git-curl-pipe์ก(์ค์ GitHub์mainraw ํ์ผ์ ๋น๊น)์ด ์ ์ผํ ๊ฒ์ฆ ๊ฒฝ๋ก.
- MacPorts/mise ๊ฐ์ ๊ฒฝ์ ๋๊ตฌ์ฒด์ธ์ ๋ํ ๊ฐ์งยท๊ฒฝ๊ณ ๋ก์ง(์ง๊ธ์ ๋ฌธ์ํ๋ง ํ๊ณ ์๋ ๊ฐ์ง๋ ์์).
- Linux ์ง์ โ ์ง๊ธ์ ๊ณํ์ด ์์ง๋ง, ๋ง์ฝ ํ๊ฒ ๋๋ค๋ฉด Homebrew macOS ์ ์ฉ ๊ฒฝ๋ก ํ๋จ ๋ก์ง๊ณผ rc ํ์ผ ๋ชฉ๋ก๋ถํฐ ๋ค์ ๋ด์ผ ํจ.
- ์ธ์ด/๋ฒ์ ์ ๋ฐ๊พธ๋ ค๋ฉด
.tool-versionsํ ์ค๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค. - ๊ฐ ์ค์น/์ ๊ฑฐ ๋จ๊ณ๋
scripts/install/,scripts/uninstall/์๋ ์ญํ ๋ณ๋ก ๋ถ๋ฆฌ๋ผ ์๊ณ , ๊ฐ๋ณ ์คํ๋ ๊ฐ๋ฅํฉ๋๋ค:DRY_RUN=true sh scripts/install/05_install_runtimes.sh - ์ฝ๋๋ฅผ ๊ณ ์ณค์ผ๋ฉด:
shellcheck -s shโdash -n(macOS ๊ธฐ๋ณธ/bin/sh๋ posix ๋ชจ๋ bash๋ผ ์ง์ง POSIX ์๋ฐ์ ๋์นจ) โshellspec/shellspec --shell dash๋กspec/์ค์ํธ ์คํ. - ์คํ์ผ ๊ท์น(๋ค์ฌ์ฐ๊ธฐ/๋ค์ด๋ฐ/๋ฐ์ดํ ๋ฑ)์ docs/shell-style-guide.md ์ฐธ๊ณ โ Google Shell Style Guide๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด ์ ์ฅ์์ POSIX sh ์ ์ฝ์ ๋ง๊ฒ ์กฐ์ ํ ๋ฒ์ ์ ๋๋ค.
- ์ ์ฒด ํ๋ฆ๋ง ํ์ธ:
./install.sh --dry-run --all --yes,./uninstall.sh --dry-run --yes - ์ค๊ธฐ๊ธฐ ๊ฒ์ฆ(Homebrew ๋ถํธ์คํธ๋ฉ, Intel Mac ๋ฑ)์
.github/workflows/e2e-verify.ymlโscripts/**/install.sh/uninstall.sh/.tool-versions๊ฐ ๋ฐ๋ ์ฑ๋กmain์ push/PR๋๋ฉด ์๋ ์คํ๋๊ณ , ๊ทธ ์ธ์๋workflow_dispatch๋ก ์๋ ์คํ. GitHub ํธ์คํ macOS ๋ฌ๋(arm64+Intel)์์ ๊ฒ์ฆ, ๊ณต๊ฐ ์ ์ฅ์๋ผ ๋ฌด๋ฃ. - ์ฝ๋ ํ์ง ์ ์ ๋ถ์์ SonarCloud(decision-13)๊ฐ push/PR๋ง๋ค ๋๋๋ค โ ์ค์ ๋ก ๋ถ์์ด ๋๋ ค๋ฉด ์ ์ฅ์ Settings โ Secrets and variables โ Actions์
SONAR_TOKEN์ ๋ฑ๋กํด์ผ ํ๊ณ , SonarCloud ํ๋ก์ ํธ ์ค์ ์ Automatic Analysis๋ ๊บผ์ผ ํฉ๋๋ค(CI ๊ธฐ๋ฐ ๋ถ์๊ณผ ๋์์ ๋ชป ์). ๋ฐ๊ฒฌ๋ ์ด์๋ ๋งค์ผ ํ ๋ฒsonarcloud๋ผ๋ฒจ์ ๋ฌ๊ณ GitHub Issues๋ก ์๋ ๋ฐํ๋ฉ๋๋ค(decision-14) โ backlog ํ์คํฌ์๋ ๋ณ๊ฐ์ ์๋ฆผ ์ฑ๋์ ๋๋ค.