μ°λ¦¬ νμ¬λ μ¬λ¬ κ°μ νλ‘μ νΈ λ ν¬μ§ν 리λ₯Ό μ΄μνκ³ μλλ°, λͺ¨λ°μΌ μ±, μΉ μλΉμ€ λ± κ°κ°μ νλ‘μ νΈλ§λ€ Tailwind config νμΌμ΄ μμκ³ , λͺ¨λ νμΌμ λμΌν λμμΈ ν ν° κ°λ€μ΄ μ€λ³΅λμ΄ μμλ€. λ¬Έμ λ λμμΈ ν ν°μ΄ λ³κ²½λ λλ§λ€ κ° λ ν¬μ tailwind.config.jsμ νλμ½λ©λ κ°μ μΌμΌμ΄ μμ ν΄μΌ νλ€λ μ μ΄μλ€. μ μ¬ ν μ²μ λμμΈνκ³Ό μ§νν νμμμ μ¬λ¬ λ ν¬λ₯Ό μΌμΌμ΄ μμ ν΄μΌ νλ λΉν¨μ¨μ΄ λ Όμλμκ³ , μ΄λ₯Ό κ°μ ν΄λ³΄κ³ μ νμλ€.
ν΄κ²°μ± : λμμΈ ν ν°μ ν¨ν€μ§λ‘ λΆλ¦¬νκΈ°
μ€λ³΅λ ν ν°μ ν κ³³μμ κ΄λ¦¬ν μ μλ ꡬ쑰λ₯Ό λ§λ€κΈ° μν΄ μ¬λ¬ κ³ λ―Όμ νμλλ°, κ²°λ‘ μ μΌλ‘λ npm ν¨ν€μ§λ‘ λΆλ¦¬νλ κ² κ°μ₯ λͺ
ννλ€. λ§μΉ¨ Tailwind v4λ‘ λ§μ΄κ·Έλ μ΄μ
μ λ§μΉ μνμκ³ , @theme λλ ν°λΈλ₯Ό ν΅ν΄ CSS λ³μ κΈ°λ°μΌλ‘ ν ν°μ μ μν μ μμλ€. μ¦, tailwind.config.js λμ μμ CSS νμΌλ§μΌλ‘ ν ν°μ μ μΈνκ³ , κ° νλ‘μ νΈμμ @import ν μ€λ‘ κ³΅ν΅ μ€νμΌμ κ°μ Έμ¬ μ μκ² λλ€.
(Tailwind v4 λ§μ΄κ·Έλ μ΄μ
κ³Όμ μ λ³λ κΈμμ μ 리νλ€.)
ν¨ν€μ§ μ μ₯μ ꡬ쑰 μ‘κΈ°
λμ€μ λμμΈ μμ€ν μ»΄ν¬λνΈλ μ¬λ¬ μ±μμ 곡ν΅μΌλ‘ μΈ μ μλλ‘ νμ₯ν κ³νμ΄ μμκΈ° λλ¬Έμ, Yarn Workspace κΈ°λ°μ λͺ¨λ Έλ ν¬ κ΅¬μ‘°λ‘ κ΅¬μ±νλ€.
company-packages/
βββ packages/
β βββ themes/ # λμμΈ ν ν° ν¨ν€μ§
β βββ src/
β β βββ brands/
β β β βββ mobile/ # λͺ¨λ°μΌ μ±μ©
β β β βββ web/ # μΉμ©
β βββ package.json
β βββ README.md
β
βββ scripts/
β βββ publish.js # λ°°ν¬ μλν
β βββ publish-all.js
β βββ test-publish.js
βββ package.json # λ£¨νΈ workspace μ€μ
λΈλλλ³ μ»€μ€ν°λ§μ΄μ§
μ°λ¦¬ μλΉμ€λ μ¬λ¬ λΈλλμ¬μ μ ν΄λ₯Ό νκ³ μμ΄μ, κ°μ μ±μ΄λΌλ λΈλλλ³λ‘ μμμ΄λ ν λ§λ₯Ό λ€λ₯΄κ² 보μ¬μ€μΌ νλ κ²½μ°κ° μλ€. μ΄λ° μꡬμ¬νμ μν΄ κ³΅ν΅ λͺ¨λ°μΌ ν ν°μ κ·Έλλ‘ μ μ§νλ©΄μ, νΉμ μ ν΄ λΈλλλ§ CSS λ³μ λ 벨μμ μμ ν ν°μ μ€λ²λΌμ΄λν μ μλ ꡬ쑰λ₯Ό λ§λ€μλ€.
:root[data-brand="PARTNER_A"] {
--color-filled-red: var(--color-red01);
}
μ¬μ©νλ μ±μ HTML λ£¨νΈ μ리먼νΈμ data-brand μμ±λ§ μ§μ ν΄μ£Όλ©΄ λλ€.
<html data-brand="PARTNER_A">
λ°°ν¬ μλν μ€ν¬λ¦½νΈ
ν¨ν€μ§λ₯Ό μ§μ λ°°ν¬νλ€ λ³΄λ, λ²μ μ μ¬λ¦¬κ³ 컀λ°νκ³ νκ·Έλ₯Ό λ§λλ κ³Όμ μμ ν΄λ¨Ό μλ¬κ° λ°μν μ¬μ§κ° μμλ€. μ΄λ° λ°λ³΅μ μΈ κ³Όμ μ μ€μ΄κΈ° μν΄ λ°°ν¬ μλν μ€ν¬λ¦½νΈλ₯Ό λ§λ€μλ€.
{
"scripts": {
"publish:themes:patch": "node scripts/publish.js themes patch",
"publish:themes:minor": "node scripts/publish.js themes minor",
"publish:themes:major": "node scripts/publish.js themes major"
}
}
μ€ν¬λ¦½νΈκ° νλ μΌ
1. package.jsonμ λ²μ μ μλμΌλ‘ μ¬λ¦¬κ³
- patch: `2.0.2` → `2.0.3`
- minor: `2.0.2` → `2.1.0`
- major: `2.0.2` → `3.0.0`
2. λ³κ²½μ¬νμ 컀λ°νκ³ νκ·Έλ₯Ό μμ±ν λ€μ
git add .
git commit -m "chore: release @company@2.0.3"
git tag @company-theme@2.0.3
3. npm publishλ‘ GitHub Packagesμ λ°°ν¬
4. λ§μ§λ§μΌλ‘ main λΈλμΉμ νκ·Έλ₯Ό push
λλΆμ μ€μ μμ΄, λꡬλ κ°μ λ°©μμΌλ‘ λ°°ν¬ν μ μκ² λμλ€.

GitHub Packages μΈμ¦ μ€μ
νμλΆλ€μ΄ ν¨ν€μ§λ₯Ό μ€μΉνλ €λ©΄ GitHub μΈμ¦μ΄ νμνλ€.
1. GitHub Personal Access Token μμ±
2. νλ‘μ νΈ λ£¨νΈμ. npmrc νμΌ μμ±
@company:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${NPM_TOKEN}
3. νκ²½λ³μ μ€μ
export NPM_TOKEN=ghp_xxxxxxxxxxxxx
ν°λ―Έλμ μ¬μμν λλ§λ€ ν ν°μ΄ μ΄κΈ°νλλ λ¬Έμ κ° μμλ€. λ§€λ² μλμΌλ‘ μ λ ₯ν΄μΌ νκΈ° λλ¬Έμ, macOSμ Keychainμ μ¬μ©ν΄ ν ν°μ μλμΌλ‘ λΆλ¬μ€λ λ°©μμΌλ‘ ν΄κ²°νλ€.
κ²°κ³Ό
Before
ν¨ν€μ§νλ₯Ό νκΈ° μ μλ λ¨ νλμ μμλ§ μμ ν΄λ λͺ¨λ λ ν¬μ§ν 리μ tailwind.config.jsλ₯Ό μ΄μ΄ κ°μ κ°μ λ°λ³΅ μμ ν΄μΌ νλ€. μμ νλ λ°κΎΈλ €λ©΄ → λͺ¨λ λ ν¬ μμ + λ°°ν¬ νμ -> μμ
μκ°μ΄ λμ΄λκ³ , μ€μ κ°λ₯μ±λ λμλ€.
After
μ΄μ λ λͺ¨λ νλ‘μ νΈκ° κ³΅ν΅ ν¨ν€μ§μ ν ν°μ κ·Έλλ‘ μ°Έμ‘°νλ€.
/* app.css */
@import '@company/themes/mobile';
λ ν¬ A: @import '@company/themes/mobile';
λ ν¬ B: @import '@company/themes/mobile';
λ ν¬ C: @import '@company/themes/web';
μμ νλλ₯Ό λ°κΎΈλ €λ©΄ themes ν¨ν€μ§μμ λ³μ κ°μ μμ νκ³ yarn publish:themes:patchλ‘ λ°°ν¬ν λ€, κ° λ ν¬μμ yarn upgrade @company/themesλ₯Ό μ€ννλ©΄ λμ΄λ€.
---
μ΄λ² νλ‘μ νΈλ₯Ό νλ©΄μ λ§μ κ³ λ―Όμ΄ μμλ€. μ¬μ€ μ²μμλ ν¨ν€μ§λ‘ λ§λλ κ²μ΄ κ³Όν μ νμ μλκΉ, μ μ§λ³΄μκ° λ μ΄λ €μμ§μ§λ μμκΉ νλ μκ°λ νλ€. νμ§λ§ μ€μ λ‘ ν¨ν€μ§λ‘ κ΄λ¦¬νκ² λλ©΄μ "ν κ³³μμ λ°κΎΈλ©΄ λͺ¨λ κ³³μ λ°μλλ€" λ μ λ’°κ° μκ²Όκ³ , λμμΈνκ³Ό κ°λ°ν λͺ¨λ ν¨μ¬ λ μΌκ΄λ μΈμ΄λ‘ μν΅ν μ μκ² λμ΄ λΏλ―νλ€. π
'π WIL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| λ°°ν¬ νλ‘μΈμ€ μκ² κ°μ ν΄λ³΄κΈ° (0) | 2025.11.23 |
|---|---|
| Framer MotionμΌλ‘ λ³Έ Rotating Text λ μ΄μμ μ²λ¦¬ λ°©μ (0) | 2025.11.16 |
| μ΄λ² μ£Όμ μκ² λ κ²λ€ (0) | 2025.11.02 |
| μ΄λ―Έμ§ ν리λ‘λ©μ ꡬννλ©° μκ² λ κ²λ€ (4) | 2025.10.25 |
| @property (1) | 2025.10.18 |