article3 - webispy/aln GitHub Wiki

macOS์— Homebrew TAP์„ ํ†ตํ•ด bottle ํŒจํ‚ค์ง€ ๋ฐฐํฌํ•˜๊ธฐ

Homebrew๋Š” macOS๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ, ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ํ•„์ˆ˜ ๋„๊ตฌ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. CLI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‰ฝ๊ฒŒ ์„ค์น˜, ์—…๋ฐ์ดํŠธ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์˜์กด์„ฑ ๋ฌธ์ œ๋„ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŽธ์˜์„ฑ ๋•๋ถ„์— Homebrew๋Š” macOS ์‚ฌ์šฉ์ž๋“ค, ํŠนํžˆ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์—†์–ด์„œ๋Š” ์•ˆ ๋  ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด์ „์— ์†Œ๊ฐœํ•œ ALN(Amazing Lucky Numbers) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ macOS์šฉ Homebrew ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค๊ณ , TAP์„ ํ†ตํ•ด bottle๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ์ƒ์„ธํžˆ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. Formula ์ž‘์„ฑ, bottle ๋นŒ๋“œ, TAP ์ €์žฅ์†Œ ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Homebrew

์šฉ์–ด

Homebrew๋Š” ๋งฅ์ฃผ ์–‘์กฐ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์ด๋ฆ„์ด ์ง€์–ด์กŒ์œผ๋ฉฐ, ๋งŽ์€ ์šฉ์–ด๋“ค์ด ๋งฅ์ฃผ ์ œ์กฐ ๊ณผ์ •๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ brew ๋ช…๋ น์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ํ„ฐ๋ฏธ๋„์— ๋งฅ์ฃผ ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐ ์šฉ์–ด์— ๋Œ€ํ•ด Homebrew์—์„œ์˜ ์˜๋ฏธ์™€ ๋งฅ์ฃผ ์–‘์กฐ์—์„œ์˜ ์˜๋ฏธ๋ฅผ ํ•จ๊ป˜ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Homebrew: macOS๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ
    • ๊ฐ€์ •์—์„œ ์ง์ ‘ ๋งŒ๋“œ๋Š” ์ˆ˜์ œ ๋งฅ์ฃผ
  • Brew: ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ๋ช…๋ น์–ด
    • ๋งฅ์ฃผ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ • ์ž์ฒด
  • Formula: ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ Ruby ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ
    • ๋งฅ์ฃผ ์ œ์กฐ๋ฅผ ์œ„ํ•œ ์žฌ๋ฃŒ์™€ ๋ฐฉ๋ฒ•์„ ๊ธฐ์ˆ ํ•œ ๋ ˆ์‹œํ”ผ
  • Cellar: Homebrew๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ (๊ธฐ๋ณธ ์œ„์น˜: Intel mac - /usr/local/Cellar, Apple Silicon Mac - /opt/homebrew/Cellar)
    • ๋งฅ์ฃผ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ˆ™์„ฑ์‹œํ‚ค๋Š” ๊ณต๊ฐ„
  • Keg: Cellar ๋‚ด์˜ ํŠน์ • ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ
    • ๋งฅ์ฃผ๋ฅผ ์ €์žฅํ•˜๊ณ  ์„œ๋น™ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ†ต
  • Tap: ๊ณต์‹ ์ €์žฅ์†Œ ์™ธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Formula ์ €์žฅ์†Œ
    • ๋งฅ์ฃผ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐธ๋ธŒ๋‚˜ ๊ผญ์ง€
  • Cask: GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Homebrew์˜ ํ™•์žฅ ๊ธฐ๋Šฅ
    • ๋Œ€๋Ÿ‰์˜ ๋งฅ์ฃผ๋ฅผ ์ €์žฅํ•˜๊ณ  ์šด๋ฐ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํฐ ํ†ต
  • Bottle: ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํŒจํ‚ค์ง€ ๋ฒ„์ „์œผ๋กœ, ์„ค์น˜ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•์‹œํ‚ด
    • ๋งฅ์ฃผ๋ฅผ ๋‹ด์•„ ํŒ๋งคํ•˜๊ฑฐ๋‚˜ ๋ณด๊ด€ํ•˜๋Š” ์œ ๋ฆฌ๋ณ‘

Homebrew ๊ธฐ๋ฐ˜์˜ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๋งฅ์ฃผ ์šฉ์–ด๋กœ ๋‹ค์‹œ ์„ค๋ช…ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ ์ •์˜
    • ๋งฅ์ฃผ ์ œ์กฐ๋ฅผ ์œ„ํ•œ ์žฌ๋ฃŒ์™€ ๋ฐฉ๋ฒ•์„ ๊ธฐ์ˆ ํ•œ ๋ ˆ์‹œํ”ผ(Formula) ์ž‘์„ฑ
  2. ํŒจํ‚ค์ง€ ๋นŒ๋“œ ๋ฐ ์ €์žฅ์†Œ(Github Release)์— ์—…๋กœ๋“œ
    • ๋งฅ์ฃผ๋ฅผ ์ œ์กฐํ•œ ํ›„ ์œ ๋ฆฌ๋ณ‘(Bottle)์— ๋‹ด์•„ ์ค€๋น„
  3. Github ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•ด Tap ์ถ”๊ฐ€ ๋ฐ ํŒจํ‚ค์ง€ ์„ค์น˜
    • ๋งฅ์ฃผ ์–‘์กฐ์žฅ์„ ํ†ตํ•ด ๋งฅ์ฃผ๋ฅผ ๋ฐ›์•„์˜ด(Tap). ๋ณ‘์œผ๋กœ ๋ฐ”๋กœ ๋ฐ›๊ฑฐ๋‚˜(Bottle) ๋ ˆ์‹œํ”ผ(Formula)๋กœ ์ง์ ‘ ์ œ์กฐ

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

Apple Silicon Mac ๊ธฐ์ค€์œผ๋กœ Homebrew๋Š” /opt/homebrew ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์„ธ๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • /opt/homebrew/ (Git ์ €์žฅ์†Œ): ์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” Homebrew์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์ด๋ฉฐ, ๋™์‹œ์— Git ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Homebrew ์ž์ฒด์˜ ์—…๋ฐ์ดํŠธ์™€ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • /opt/homebrew/bin/: Homebrew๋กœ ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€์˜ ์‹คํ–‰ ํŒŒ์ผ๋“ค์ด ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • /opt/homebrew/Cellar/: ์‹ค์ œ ํŒจํ‚ค์ง€๋“ค์ด ์„ค์น˜๋˜๋Š” ์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ๊ฐ ํŒจํ‚ค์ง€๋Š” ์ž์‹ ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • /opt/homebrew/Caskroom/: Cask๋กœ ์„ค์น˜๋œ GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • /opt/homebrew/etc/: ์„ค์ • ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/include/: ํ—ค๋” ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/lib/: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/opt/: ํ˜„์žฌ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋“ค์˜ ์ตœ์‹  ๋ฒ„์ „์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • /opt/homebrew/sbin/: ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์šฉ ์‹คํ–‰ ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • /opt/homebrew/share/: ๊ณต์œ  ๋ฆฌ์†Œ์Šค(๋ฌธ์„œ, ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€ ๋“ฑ)๊ฐ€ ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/var/: ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ(๋กœ๊ทธ ํŒŒ์ผ ๋“ฑ)๊ฐ€ ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/Homebrew/: Homebrew ์ฝ”์–ด์˜ Git ์„œ๋ธŒ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. Formula๋“ค์˜ ์ •์˜๋„ ์ด ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • /opt/homebrew/Frameworks/: ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด ์„ค์น˜๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/Library/Homebrew/: Homebrew์˜ Ruby ์ฝ”๋“œ ๋Œ€๋ถ€๋ถ„์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Homebrew์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
  • /opt/homebrew/Library/Taps/: ์—ฌ๊ธฐ์—๋Š” ํƒญ(tap)๋œ ์ €์žฅ์†Œ๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ homebrew/core์™€ homebrew/cask๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•œ ๋‹ค๋ฅธ ํƒญ๋“ค๋„ ์ด ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

/opt/homebrew๊ฐ€ Git ์ €์žฅ์†Œ๋ผ๋Š” ์ ์€ Homebrew์˜ ์ž์ฒด ์—…๋ฐ์ดํŠธ์™€ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” brew update ๋ช…๋ น์„ ํ†ตํ•ด ์ด ์ €์žฅ์†Œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” Homebrew ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์ผ๊ด€์„ฑ๊ณผ ์ตœ์‹ ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” Homebrew๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์‚ฌ์šฉ์ž ์‹œ์Šคํ…œ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์šด์˜๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ฐ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํŠน์ • ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

glib ํŒจํ‚ค์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. brew install glib ๋ช…๋ น์–ด๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉด /opt/homebrew/Cellar ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— {name}/{version} ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ์•„๋ž˜์— ์‹ค์ œ๋กœ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ๋“ค์ด ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

/opt/homebrew/Cellar
โ””โ”€โ”€ glib
    โ””โ”€โ”€ 2.80.3
        โ”œโ”€โ”€ bin
        โ”œโ”€โ”€ etc
        โ”œโ”€โ”€ include
        โ”œโ”€โ”€ lib
        โ””โ”€โ”€ share

๊ทธ๋ฆฌ๊ณ  ๊ฐ ํŒŒ์ผ๋“ค์€ /opt/homebrew์˜ ์ ์ ˆํ•œ ์œ„์น˜์— Symbolic link๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

$ ls -l /opt/homebrew/bin/gdbus
/opt/homebrew/bin/gdbus -> ../Cellar/glib/2.80.3/bin/gdbus

$ ls -l /opt/homebrew/lib/libglib-2.0.dylib
/opt/homebrew/lib/libglib-2.0.dylib -> ../Cellar/glib/2.80.3/lib/libglib-2.0.dylib

$ ls -l /opt/homebrew/opt/glib
/opt/homebrew/opt/glib -> ../Cellar/glib/2.80.3

brew

Homebrew ํŒจํ‚ค์ง€๋Š” brew ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ์„ค์น˜, ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ช…๋ น:

brew install <ํŒจํ‚ค์ง€๋ช…>: ํŒจํ‚ค์ง€ ์„ค์น˜
brew uninstall <ํŒจํ‚ค์ง€๋ช…>: ํŒจํ‚ค์ง€ ์ œ๊ฑฐ
brew update: Homebrew ์ž์ฒด์™€ ๊ณต์‹ ํŒจํ‚ค์ง€ ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ
brew upgrade: ์„ค์น˜๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ
brew list: ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก ํ™•์ธ
brew search <๊ฒ€์ƒ‰์–ด>: ํŒจํ‚ค์ง€ ๊ฒ€์ƒ‰
brew info <ํŒจํ‚ค์ง€๋ช…>: ํŒจํ‚ค์ง€ ์ •๋ณด ํ™•์ธ
brew tap <user/repo>: Tap ์ถ”๊ฐ€
brew untap <tap>: Tap ์ œ๊ฑฐ

Formula, Tap ๋“ฑ ํŒจํ‚ค์ง€ ์ž‘์„ฑ์„ ์œ„ํ•œ ๊ฐœ๋ฐœ์ž ๋ช…๋ น:

brew tap-new <user/repo>: Tap ์ƒ์„ฑ
brew create <URL>: Formula ์ƒ์„ฑ
brew edit <formula>: Formula ํŽธ์ง‘
brew audit <formula>: Formula ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
brew style <formula>: Formula style ๊ฐ€์ด๋“œ ๊ฒ€์‚ฌ

์ „์ฒด ๋ช…๋ น์— ๋Œ€ํ•œ ์„ค๋ช…์€ https://docs.brew.sh/Manpage๋ฅผ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋ช…๋ น์€ https://docs.brew.sh/Manpage#developer-commands๋ฅผ ํ†ตํ•ด ๋” ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๋งŒ๋“ค๊ธฐ

์ด์ œ ์‹ค์ œ๋กœ Homebrew ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

Formula ์ž‘์„ฑ

Formula ์ž‘์„ฑ์„ ์œ„ํ•ด ๋จผ์ € ์•„๋ž˜ ๋ช…๋ น์„ ํ†ตํ•ด ๊ธฐ๋ณธ ์ž‘์—… ๊ณต๊ฐ„(homebrew/core ์ €์žฅ์†Œ ์‚ฌ์šฉ)์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

export HOMEBREW_NO_INSTALL_FROM_API=1
brew tap --force homebrew/core

์—ฌ๊ธฐ์„œ HOMEBREW_NO_INSTALL_FROM_API=1 ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” Homebrew๊ฐ€ API๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋Œ€์‹  ๋กœ์ปฌ Formula ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. brew tap --force homebrew/core ๋ช…๋ น์€ Homebrew์˜ ํ•ต์‹ฌ Formula ์ €์žฅ์†Œ๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ํƒญ(tap)ํ•˜์—ฌ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์ƒˆ๋กœ์šด Formula๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด brew create ๋ช…๋ น์œผ๋กœ ํŒจํ‚ค์ง•์— ์‚ฌ์šฉํ•  ALN ์†Œ์Šค ์••์ถ•ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

$ brew create https://github.com/webispy/aln/archive/refs/tags/v0.1.1.tar.gz
Formula name [aln]:

Formula๋กœ ์‚ฌ์šฉํ•  ์ด๋ฆ„์„ ๋ฌผ์–ด๋ณด๋ฉด ์›ํ•˜๋Š” ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” ์ž๋™์œผ๋กœ ์ถ”์ฒœํ•ด์ค€ aln์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์„ค์ •ํ•˜๊ณ  ๋‚˜๋ฉด ์†Œ์Šค ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ  ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ Formula ํŒŒ์ผ์ด ํŽธ์ง‘๊ธฐ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (Formula ํŒŒ์ผ์€ /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/a/aln.rb ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.)

# Documentation: https://docs.brew.sh/Formula-Cookbook
#                https://rubydoc.brew.sh/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
class Aln < Formula
  desc "Amazing Lucky Numbers"
  homepage "https://webispy.github.io/aln/"
  url "https://github.com/webispy/aln/archive/refs/tags/v0.1.1.tar.gz"
  sha256 "e1ca51e3153b0b7824b36417c0acd5f4057028992ef1af0cde753408cd21a276"
  license "Apache-2.0"

  # depends_on "cmake" => :build

  def install
    # Remove unrecognized options if they cause configure to fail
    # https://rubydoc.brew.sh/Formula.html#std_configure_args-instance_method
    system "./configure", "--disable-silent-rules", *std_configure_args
    # system "cmake", "-S", ".", "-B", "build", *std_cmake_args
  end

  test do
    # `test do` will create, run in and delete a temporary directory.
    #
    # This test will fail and we won't accept that! For Homebrew/homebrew-core
    # this will need to be a test that verifies the functionality of the
    # software. Run the test with `brew test aln`. Options passed
    # to `brew install` such as `--HEAD` also need to be provided to `brew test`.
    #
    # The installed folder is not in the path, so use the entire path to any
    # executables being tested: `system "#{bin}/program", "do", "something"`.
    system "false"
  end
end

์ €์žฅํ•˜๊ณ  ํŽธ์ง‘๊ธฐ๋ฅผ ๋น ์ ธ๋‚˜์˜จ ๋’ค, ์•„๋ž˜์™€ ๊ฐ™์ด edit ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ๋‹ค์‹œ ํŒŒ์ผ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

brew edit aln

์ด์ œ ํŽธ์ง‘์ฐฝ์—์„œ ALN ๋นŒ๋“œ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์„œ ๋‚ด์šฉ์„ ์ฑ„์›Œ๋„ฃ์Šต๋‹ˆ๋‹ค. homebrew-core ์ €์žฅ์†Œ(https://github.com/Homebrew/homebrew-core/tree/master/Formula)๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋‹ค์–‘ํ•œ Formula ์˜ˆ์ œ๋“ค์„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ALN์€ CMake ๊ธฐ๋ฐ˜์˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ๋ฐ ๋นŒ๋“œ ๋ช…๋ น๋“ค์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ, Homebrew์—์„œ CMake ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CMake ์˜ต์…˜์œผ๋กœ *std_cmake_args์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ๊ฐ’๋“ค์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

class Aln < Formula
  desc "Amazing Lucky Numbers Library"
  homepage "https://github.com/webispy/aln"
  url "https://github.com/webispy/aln/archive/refs/tags/v0.1.0.tar.gz"
  sha256 "8db44f88840ae7c93eb237e5aec9f8aa49c5c03bf29e3360f5eabed2f7729902"
  license "Apache-2.0"

  head "https://github.com/webispy/aln.git", branch: "master"

  depends_on "cmake" => :build
  depends_on "pkg-config" => :build
  depends_on "glib"

  def install
    args = %W[
      -DCMAKE_INSTALL_RPATH=#{rpath}
    ]

    system "cmake", "-S", ".", "-B", "build", *args, *std_cmake_args
    system "cmake", "--build", "build"
    system "cmake", "--install", "build"
  end

  test do
    system "#{bin}/aln"
  end
end

์†Œ์Šค ์••์ถ• ํŒŒ์ผ์— ๋Œ€ํ•œ sha256 ์ฒดํฌ์„ฌ์˜ ๊ฒฝ์šฐ coreutils ํŒจํ‚ค์ง€ ์„ค์น˜ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด sha256sum ๋ช…๋ น์œผ๋กœ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ brew install coreutils
$ sha256sum v0.1.0.tar.gz
8db44f88840ae7c93eb237e5aec9f8aa49c5c03bf29e3360f5eabed2f7729902  v0.1.0.tar.gz

์ž‘์„ฑํ•œ Formula ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ฌธ๋ฒ•์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ brew audit -new aln
  * GitHub repository not notable enough (<30 forks, <30 watchers and <75 stars)
Error: 1 problem in 1 formula detected.

ALN ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์œ ๋ช…ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋ฉ”์ธ ์ €์žฅ์†Œ์ธ homebrew-core์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ  ๋ณ„๋„ Tap์„ ํ†ตํ•ด ๋ฐฐํฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์—๋Ÿฌ๋Š” ๋ฌด์‹œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

์ž‘์„ฑํ•œ Formula ํŒŒ์ผ์˜ ์Šคํƒ€์ผ๋„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ brew style aln
1 file inspected, no offenses detected

์ด์ œ ์ž‘์„ฑํ•œ Formula๋ฅผ ์ด์šฉํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ ํŒจํ‚ค์ง€ ๋นŒ๋“œ ๋ฐ ์„ค์น˜๊ฐ€ ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. aln์€ ์•„์ง Bottle๋กœ ๋ฐฐํฌ๋œ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง์ ‘ ๋นŒ๋“œํ•ด์„œ ์„ค์น˜ํ•˜๋„๋ก --build-from-source ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$ brew install --build-from-source aln

==> Fetching dependencies for aln: cmake and glib
==> Fetching cmake
==> Downloading https://ghcr.io/v2/homebrew/core/cmake/manifests/3.30.0
############################################################################################################################################################################################################# 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:4eb265cf09f23ebab2f4b5cc463150a8cd1004b480e43496593bebec24eb49f6
############################################################################################################################################################################################################# 100.0%
==> Fetching glib
==> Downloading https://ghcr.io/v2/homebrew/core/glib/manifests/2.80.4
############################################################################################################################################################################################################# 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/glib/blobs/sha256:e52c5b1cfc4a9c37fbd697a29d37c96d778d0699d2051d167ca3fd76010c25e2
############################################################################################################################################################################################################# 100.0%
==> Fetching aln
==> Downloading https://github.com/webispy/aln/archive/refs/tags/v0.1.0.tar.gz
==> Downloading from https://codeload.github.com/webispy/aln/tar.gz/refs/tags/v0.1.0
##O=- #     #
==> Installing dependencies for aln: cmake and glib
==> Installing aln dependency: cmake
==> Downloading https://ghcr.io/v2/homebrew/core/cmake/manifests/3.30.0
Already downloaded: /Users/work/Library/Caches/Homebrew/downloads/dce5c120f5a36a420d00e9c5a8262781cc00bb40d11f512da96d7bfd3a5e38cb--cmake-3.30.0.bottle_manifest.json
==> Pouring cmake--3.30.0.arm64_sonoma.bottle.tar.gz
๐Ÿบ  /opt/homebrew/Cellar/cmake/3.30.0: 3,424 files, 55.3MB
==> Installing aln dependency: glib
==> Downloading https://ghcr.io/v2/homebrew/core/glib/manifests/2.80.4
Already downloaded: /Users/work/Library/Caches/Homebrew/downloads/f635cb07f35354f1ef636173e4d8f0e85a3bd09d85784c8639a201b1c5263742--glib-2.80.4.bottle_manifest.json
==> Pouring glib--2.80.4.arm64_sonoma.bottle.tar.gz
๐Ÿบ  /opt/homebrew/Cellar/glib/2.80.4: 526 files, 36.2MB

aln.rb Formula์—์„œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋กœ ์ •์˜ํ•œ cmake์™€ glib ํŒจํ‚ค์ง€๊ฐ€ ์ž๋™์œผ๋กœ ์„ค์น˜๋œ ํ›„ aln์— ๋Œ€ํ•ด ๋นŒ๋“œ ๋ฐ ์„ค์น˜๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

==> Installing aln
==> cmake -S . -B build -DCMAKE_INSTALL_RPATH=@loader_path/../lib
==> cmake --build build
==> cmake --install build
๐Ÿบ  /opt/homebrew/Cellar/aln/0.1.0: 12 files, 132.9KB, built in 22 seconds
==> Running `brew cleanup aln`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /Users/work/Library/Caches/Homebrew/aln--0.1.1.tar.gz... (50.9KB)
==> Upgrading 2 dependents of upgraded formulae:
Disable this behaviour by setting HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
harfbuzz 8.5.0 -> 9.0.0, libass 0.17.2 -> 0.17.3
==> Downloading https://ghcr.io/v2/homebrew/core/harfbuzz/manifests/9.0.0
############################################################################################################################################################################################################# 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libass/manifests/0.17.3
Already downloaded: /Users/work/Library/Caches/Homebrew/downloads/84606583aa38b5ab3bcd159983c1468927012bf37cf5d21cc8e3a9eb334b252d--libass-0.17.3.bottle_manifest.json
==> Checking for dependents of upgraded formulae...
==> No broken dependents found!

๋นŒ๋“œ ๋ฐ ์„ค์น˜๊ฐ€ ๋ฌธ์ œ์—†์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚ฌ์œผ๋‹ˆ brew uninstall aln๋กœ ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ Formula ์ž‘์„ฑ์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ Homebrew ํŒจํ‚ค์ง• ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์œผ๋ฉฐ, ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://docs.brew.sh/Formula-Cookbook ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‹ค์ œ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์—์„œ๋Š” Tap์„ ํ†ตํ•ด Formula๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Github Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bottle์„ ์ž๋™์œผ๋กœ ๋ฆด๋ฆฌ์ฆˆํ•˜๋Š” ๊ณผ์ •๋„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Tap ๋ฐฐํฌํ•˜๊ธฐ

Homebrew๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Github repository๋ฅผ ํ†ตํ•ด Formula๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ปดํŒŒ์ผ๋œ ํŒจํ‚ค์ง€๋Š” Github packages๋ฅผ ํ†ตํ•ด ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://github.com/orgs/Homebrew/packages์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ brew install๋กœ ALN ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋กœ ์„ค์น˜๋œ cmake๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ํ•ด๋‹น ํŒจํ‚ค์ง€๋Š” homebrew-core์—์„œ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— core/cmake๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐฐํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, https://github.com/Homebrew/homebrew-core/pkgs/container/core%2Fcmake์—์„œ ๋ฐฐํฌ๋œ ๋ชจ๋“  ๋ฒ„์ „์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ๋‚ด์šฉ์€ ๋ฒ„์ „ ์„ ํƒ ํ›„ OS/Arch ํƒญ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

๋˜ํ•œ, Tap์„ ์œ„ํ•ด Github release์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ๊ฐ ํŒจํ‚ค์ง€๋ณ„๋กœ ์ปดํŒŒ์ผ๋œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์ธ bottle์„ ๋ฐฐํฌ ๋ฐ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  Github Actions ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Tap ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ €์žฅ์†Œ ์ค€๋น„

brew tap-new <user/repo> ๋ช…๋ น์–ด ํ•˜๋‚˜๋กœ ๋ฐฐํฌ์™€ ๊ด€๋ จ๋œ Github Actions ์Šคํฌ๋ฆฝํŠธ์™€ ๊ธฐ๋ณธ Git ์ €์žฅ์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

repo ์ด๋ฆ„์— aln์„ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ด๋ฆ„ ๊ทœ์น™์— ๋”ฐ๋ผ ์•ž์— homebrew- ์ ‘๋‘์‚ฌ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ Github ์ €์žฅ์†Œ ์ด๋ฆ„์€ webispy/homebrew-aln ์ด์ง€๋งŒ, Tap์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” webispy/aln ์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ brew tap-new webispy/aln
Initialized empty Git repository in /opt/homebrew/Library/Taps/webispy/homebrew-aln/.git/
[main (root-commit) 6ccefd4] Create webispy/aln tap
 3 files changed, 97 insertions(+)
 create mode 100644 .github/workflows/publish.yml
 create mode 100644 .github/workflows/tests.yml
 create mode 100644 README.md
==> Created webispy/aln
/opt/homebrew/Library/Taps/webispy/homebrew-aln

When a pull request making changes to a formula (or formulae) becomes green
(all checks passed), then you can publish the built bottles.
To do so, label your PR as `pr-pull` and the workflow will be triggered.

๋ช…๋ น์ด ์„ฑ๊ณตํ•˜๋ฉด, /opt/homebrew/Library/Taps/webispy/homebrew-aln ๋””๋ ‰ํ† ๋ฆฌ์— Git ์ €์žฅ์†Œ๊ฐ€ ์ค€๋น„๋ฉ๋‹ˆ๋‹ค.

์ด์ œ Github ํ™ˆํŽ˜์ด์ง€์—์„œ homebrew-aln ์ด๋ผ๋Š” ๋น„์–ด ์žˆ๋Š” ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, ์œ„์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ๋“ค์„ ์—…๋กœ๋“œ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (์ฐธ๊ณ ๋กœ, ๊ฐœ์ธ์ ์œผ๋กœ homebrew-aln ์ €์žฅ์†Œ๋ฅผ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด homebrew-haha๋กœ ํ™”๋ฉด์„ ์บก์ณํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

Github - New repository

์ €์žฅ์†Œ์— ์—…๋กœ๋“œํ•  ํŒŒ์ผ์ด ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์˜ต์…˜ ์„ ํƒ ์—†์ด ๋ฐ”๋กœ Create repository ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Github - Create new repository

์ €์žฅ์†Œ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ๋ณธ ์•ˆ๋‚ด ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Github - New repository Created

์ด์ œ ์ €์žฅ์†Œ์— ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. tap-new ๋ช…๋ น ๋‹จ๊ณ„์—์„œ ์ปค๋ฐ‹์ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, remote๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ๋ฐ”๋กœ push ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

cd /opt/homebrew/Library/Taps/webispy/homebrew-aln
git remote add origin [email protected]:webispy/homebrew-aln.git
git push -u origin main

์—…๋กœ๋“œ ํ›„ Github ์ €์žฅ์†Œ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด ํŒŒ์ผ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ์—…๋กœ๋“œ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋นŒ๋“œ๊ฐ€ ๋™์ž‘ ์ค‘์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Actions ๋ฉ”๋‰ด์—์„œ ์ง„ํ–‰์ค‘์ธ ๋นŒ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Github - Repository main

์ด์ œ Actions๋ฅผ ์„ ํƒํ•ด ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. brew tap-new๋ฅผ ํ†ตํ•ด ์ž๋™ ์ƒ์„ฑ๋œ Github Actions์˜ workflow ํ•ญ๋ชฉ๋“ค์„ ์™ผ์ชฝ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ workflow ๋นŒ๋“œ ์ƒํƒœ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Github - Action status

์ง„ํ–‰ ์ค‘์ธ workflow๋ฅผ ์„ ํƒํ•ด ์„ธ๋ถ€ ๋‚ด์šฉ์„ ํ™•์ธํ•ด๋ณด๋ฉด, Jobs ํ•ญ๋ชฉ์— 3๊ฐœ์˜ ์•„์ดํ…œ์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Github Actions์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ์‹คํ–‰ ํ™˜๊ฒฝ(Runner)๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, brew tap-new ๋ช…๋ น์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ์— ๋”ฐ๋ผ Ubuntu 22.04, macOS 13, macOS 14์—์„œ ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ Github Runner์—์„œ ์ œ๊ณตํ•˜๋Š” macOS 13 (Ventura) runner๋Š” Intel Mac์—์„œ, macOS 14 (Sonoma) runner๋Š” Apple Silicon Mac์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Formula๋ฅผ ์ž‘์„ฑํ•ด์„œ ์—…๋กœ๋“œํ•˜๋ฉด ๋‘๊ฐ€์ง€ Architecture๋ฅผ ์ง€์›ํ•˜๋Š” ์ปดํŒŒ์ผ๋œ ํŒจํ‚ค์ง€(bottle)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Github - Action jobs

์ด์ œ ๊ธฐ๋ณธ์ ์ธ ์ค€๋น„ ๊ณผ์ •์€ ๋ชจ๋‘ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ž‘์„ฑํ•œ Formula๋ฅผ ์—…๋กœ๋“œํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Tap์„ ํ†ตํ•ด Formula ๋ฐฐํฌํ•˜๊ธฐ

brew tap-new๋ฅผ ํ†ตํ•ด ์ž๋™ ์ƒ์„ฑ๋œ Github Actions workflow์—๋Š” Pull request๋ฅผ ํ†ตํ•ด Formula ํŒŒ์ผ์„ ๊ฒ€ํ†  ๋ฐ ๋นŒ๋“œํ•˜๊ณ , main ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋‹จ๊ณ„์—์„œ brew create๋กœ ์ƒ์„ฑํ•˜๊ณ  brew edit๋กœ ์ˆ˜์ •ํ•œ aln.rb Formula ํŒŒ์ผ์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Pull request๋ฅผ ๋งŒ๋“ค์–ด ์—…๋กœ๋“œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € Pull request๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

cd /opt/homebrew/Library/Taps/webispy/homebrew-aln
git checkout -b add_aln

์ž‘์„ฑํ–ˆ๋˜ aln.rb Formula ํŒŒ์ผ์„ ํ˜„์žฌ ์ €์žฅ์†Œ ๋””๋ ‰ํ† ๋ฆฌ์˜ Formula/ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.

mv /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/a/aln.rb Formula

์ปค๋ฐ‹์„ ์ƒ์„ฑํ•œ ํ›„ ๋ธŒ๋žœ์น˜์— push ํ•ฉ๋‹ˆ๋‹ค.

git add Formula/aln.rb
git commit -m "Formula: add aln"
git push origin add_aln

Github ์ €์žฅ์†Œ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹์ด ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ์•Œ๋ฆผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compare & pull request ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Github - Pull request noti

Pull request ์ž‘์„ฑ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. ํ•„์š”์‹œ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ผ๋‹จ Create pull request๋ฅผ ์„ ํƒํ•ด ๋ฐ”๋กœ PR(Pull Request)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Github - Open a pull request

PR์ด ์ƒ์„ฑ๋˜๋ฉด Github Actions workflow์— ์˜ํ•ด ๋นŒ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด 3๊ฐœ์˜ ๋นŒ๋“œ๊ฐ€ ์ง„ํ–‰์ค‘์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Github - Pull request CI running

๋นŒ๋“œ๊ฐ€ ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜๋ฉด All checks have passed๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด PR์„ main ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, brew tap-new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ Github Actions workflow์—๋Š” ์ด ๋ณ‘ํ•ฉ ๊ณผ์ •์— ๋Œ€ํ•œ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์ง์ ‘ Merge pull request๋ฅผ ์„ ํƒํ•˜์ง€ ๋ง๊ณ  Labels๋ฅผ ํ†ตํ•ด ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Github - Pull request CI success

Github Actions workflows ์ค‘ .github/workflows/publish.yml ํŒŒ์ผ์— ์ •์˜๋œ ๋‚ด์šฉ์„ ํ™•์ธํ•ด ๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด pr-pull ์ด๋ผ๋Š” ๋ผ๋ฒจ์ด ์„ค์ •๋˜๋ฉด ๋™์ž‘ํ•˜๋„๋ก ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

name: brew pr-pull

on:
  pull_request_target:
    types:
      - labeled

jobs:
  pr-pull:
    if: contains(github.event.pull_request.labels.*.name, 'pr-pull')
    ...

๋”ฐ๋ผ์„œ, pr-pull ๋ผ๋ฒจ์„ ์„ ํƒํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ Github ์ €์žฅ์†Œ ์ƒ์„ฑ์‹œ ์ž๋™์œผ๋กœ ์ œ๊ณต๋˜๋Š” Labels ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Label ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด Issues ๋ฉ”๋‰ด์—์„œ Labels๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Github - Issues - Labels

ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Label ๋ชฉ๋ก์ด ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, New label์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Github - New label

Label ์ƒ์„ฑ ํ™”๋ฉด์—์„œ ์ด๋ฆ„์— pr-pull์„ ์ž…๋ ฅํ•œ ๋’ค Create label์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Label ์ƒ‰์ƒ์€ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ  ๋žœ๋ค์œผ๋กœ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ์ง์ ‘ ์ƒ‰์ƒ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

Github - Label create

์ด์ œ ์•„๋ž˜์™€ ๊ฐ™์ด Label ๋ชฉ๋ก์— pr-pull์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Github - Label list

๋‹ค์‹œ Pull requests ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€์„œ Labels ํ•ญ๋ชฉ์— ์žˆ๋Š” ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ์•„์ด์ฝ˜์„ ์„ ํƒํ•œ ๋’ค, ์œ„์—์„œ ์ƒ์„ฑํ•œ pr-pull ๋ผ๋ฒจ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Github - Pull request - Label select

๋ผ๋ฒจ์ด ์„ ํƒ๋˜๋ฉด, ์œ„์˜ Workflow์— ์ •์˜๋œ ํŠธ๋ฆฌ๊ฑฐ์— ์˜ํ•ด ๋นŒ๋“œ๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

Github - Pull request - New workflow run

๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜๋ฉด, Pull request๊ฐ€ ์ž๋™์œผ๋กœ Closed ์ฒ˜๋ฆฌ๋˜๊ณ , main ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜๋˜๋Š”๋ฐ, Formula ํŒŒ์ผ์˜ bottle ๋ถ€๋ถ„์ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ์ƒํƒœ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

...
  bottle do
    root_url "https://github.com/webispy/homebrew-haha/releases/download/aln-0.1.0"
    sha256 cellar: :any,                 arm64_sonoma: "1521a642335a82a6e039109f22730476d7180e92a1fe6ffb04348e01a42503d9"
    sha256 cellar: :any,                 ventura:      "8143c23b5fb4650b31dc6ca90eaaa6c3ea15615ff405fed4a1c588bc3e6ecba9"
    sha256 cellar: :any_skip_relocation, x86_64_linux: "1eb42a074a8698120b27d65d460dc2e1feb7a959a0edb3c20dd3190eeddb0221"
  end
...

Github - Pull request - Auto closed

Bottle์ด ์ •์ƒ์ ์œผ๋กœ ์ž˜ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๋Š” Github Releases๋ฅผ ํ†ตํ•ด ์ง„ํ–‰๋˜๋Š”๋ฐ, Github ์ €์žฅ์†Œ ๊ธฐ๋ณธ ํ™”๋ฉด์„ ๋ณด๋ฉด ์˜ค๋ฅธ์ชฝ Releases์— aln-0.1.0์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ธ ๋‚ด์šฉ์„ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด Releases๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Github - Releases

์•„๋ž˜์™€ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ 3๊ฐœ์˜ Bottle์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • aln-0.1.0.arm64_sonoma.bottle.tar.gz (macOS 14 - Apple Silicon Mac)
  • aln-0.1.0.ventura.bottle.tar.gz (macOS 13 - Intel Mac)
  • aln-0.1.0.x86_64_linux.bottle.tar.gz (Linux - x86_64)

Github - Release assets

์ง€๊ธˆ๊นŒ์ง€ Tap์„ ํ†ตํ•ด Formula๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ๋ฐฐํฌํ•œ Formula๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌํ•œ Formula ์„ค์น˜

์ด์ „ ๋‹จ๊ณ„์—์„œ Github Releases๋ฅผ ํ†ตํ•ด ๋ฐฐํฌํ•œ Formula๊ฐ€ Homebrew๋ฅผ ํ†ตํ•ด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž‘์—…ํ–ˆ๋˜ tap์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค:

$ brew untap webispy/aln
Untapping webispy/aln...
Untapped 1 formula (15 files, 11.5KB).

Tap์—์„œ ๋ฐฐํฌํ•˜๋Š” Formula ์„ค์น˜์‹œ, Tap์„ ๋จผ์ € ์ถ”๊ฐ€ํ•˜๊ณ  Formula๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ Formula ์ด๋ฆ„์— Tap์„ ํฌํ•จ์‹œ์ผœ์„œ ํ•œ๋ฒˆ์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tap์„ ๋จผ์ € ์ถ”๊ฐ€ํ•˜๊ณ  Formula ์„ค์น˜:

$ brew tap webispy/aln
Tapped 1 formula (15 files, 11.5KB).

$ brew install aln
==> Fetching webispy/aln/aln
==> Downloading https://github.com/webispy/homebrew-aln/releases/download/aln-0.1.0/aln-0.1.0.arm64_sonoma.bottle.tar.gz
Already downloaded: /Users/work/Library/Caches/Homebrew/downloads/5bcd7a6e2afabcaa8cab7b038840b65fe9c56b3f607fd87a841cf195a255fbed--aln-0.1.0.arm64_sonoma.bottle.tar.gz
==> Installing aln from webispy/aln
==> Pouring aln-0.1.0.arm64_sonoma.bottle.tar.gz
๐Ÿบ  /opt/homebrew/Cellar/aln/0.1.0: 12 files, 151.5KB
==> Running `brew cleanup aln`...

Formula ์ด๋ฆ„์— Tap์„ ํฌํ•จ์‹œ์ผœ์„œ ํ•œ๋ฒˆ์— ์„ค์น˜:

$ brew install webispy/aln/aln
Tapped 1 formula (15 files, 11.5KB).
==> Fetching webispy/aln/aln
==> Downloading https://github.com/webispy/homebrew-aln/releases/download/aln-0.1.0/aln-0.1.0.arm64_sonoma.bottle.tar.gz
Already downloaded: /Users/work/Library/Caches/Homebrew/downloads/5bcd7a6e2afabcaa8cab7b038840b65fe9c56b3f607fd87a841cf195a255fbed--aln-0.1.0.arm64_sonoma.bottle.tar.gz
==> Installing aln from webispy/aln
==> Pouring aln-0.1.0.arm64_sonoma.bottle.tar.gz
๐Ÿบ  /opt/homebrew/Cellar/aln/0.1.0: 12 files, 151.5KB
==> Running `brew cleanup aln`...

๋งˆ๋ฌด๋ฆฌ

์ด๋ ‡๊ฒŒ ํ•ด์„œ macOS์—์„œ Homebrew Formula๋ฅผ ์ž‘์„ฑํ•˜๊ณ  TAP์„ ํ†ตํ•ด bottle ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Homebrew์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ TAP์„ ํ™œ์šฉํ•˜๋ฉด, ์ž์‹ ๋งŒ์˜ ํŒจํ‚ค์ง€๋ฅผ ์†์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์ด ์—ฌ๋Ÿฌ๋ถ„์˜ Homebrew ํ™œ์šฉ์— ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ