๋ฐ˜์‘ํ˜•

ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” Node ๋ฒ„์ „์ด ๋‹ค๋ฅด๋‹ค๋ฉด nvm์„ ์ด์šฉํ•ด์„œ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ๋…ธ๋“œ ๋ฒ„์ „์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด๋‹ค. direnv๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ๋…ธ๋“œ ๋ฒ„์ „์ด ์ž๋™์œผ๋กœ ๋ฐ”๋€Œ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. direnv๋Š” ํด๋”๋ณ„๋กœ ํ™˜๊ฒฝ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค.

 

์„ค์น˜


โถ direnv ์„ค์น˜

brew install direnv # homebrew๋กœ direnv ์„ค์น˜

 

โท direnv hook ์„ค์ •(ํด๋” ์ด๋™์‹œ ํ•ด๋‹น ํด๋”์˜ .envrc ํŒŒ์ผ ์ž๋™ ์‹คํ–‰). 

oh-my-zsh๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด `.zshrc` ํŒŒ์ผ `plugins` ๋ฐฐ์—ด์— `direnv`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„ค์ •๋œ๋‹ค.

# ~/.zshrc
plugins=(... direnv)

 

oh-my-zsh๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ `.zshrc` ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

# ~/.zshrc
eval "$(direnv hook zsh)"

 

โธ shell ๋‹ค์‹œ ์‹œ์ž‘

source ~/.zshrc

 

์„ค์ •


์ด์ œ ํด๋”๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค direnv hook์ด ํ˜„์žฌ ๋ฐ ๋ถ€๋ชจ ํด๋”์— .envrc ์„ค์ • ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋งŒ์„ ์œ„ํ•œ ์„ค์ •(.envrc ํŒŒ์ผ์— ์ž…๋ ฅํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ)์„ ๋กœ๋“œํ•œ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋น ์ ธ๋‚˜์˜ค๋ฉด ์ด ์„ค์ •๋“ค์ด ์–ธ๋กœ๋“œ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ direnv๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋”๋ณ„๋กœ ๋…ธ๋“œ ๋ฒ„์ „์ด๋‚˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ~/.zshrc ํŒŒ์ผ์— ๋ชฐ์•„๋„ฃ์ง€ ์•Š์•„๋„ ๋˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

.nvmrc ํŒŒ์ผ ์ƒ์„ฑ

๐Ÿ’ก .nvmrc ํŒŒ์ผ์€ ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์„ค์ •ํŒŒ์ผ๋กœ, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ๋ฒ„์ „ ๋ช…์‹œํ•œ๋‹ค.

 

โถ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ํด๋”์— .nvmrc ํŒŒ์ผ ์ƒ์„ฑ

touch .nvmrc

 

โท .nvmrc ํŒŒ์ผ์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ node ๋ฒ„์ „ ์ž…๋ ฅ

# .nvmrc
16.13.1

 

์ฐธ๊ณ ๋กœ .nvmrc ํŒŒ์ผ์ด ์žˆ๋Š” ํด๋”์—์„œ nvm use ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, .nvmrc ํŒŒ์ผ์— ์ž…๋ ฅํ•œ ๋…ธ๋“œ ๋ฒ„์ „์œผ๋กœ ๊ต์ฒด๋œ๋‹ค(nvm use 16.13.1 ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ ๊ฒƒ๊ณผ ๋™์ผ).

nvm use
# Found... .nvmrc' with version <16.13.1>
# Now using node v16.13.1 (npm v8.1.2)

 

.envrc ํŒŒ์ผ ์ƒ์„ฑ

๐Ÿ’ก ํด๋”๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค direnv hook์ด ํ˜„์žฌ ๋ฐ ๋ถ€๋ชจ ํด๋”์— .envrc ์„ค์ • ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋งŒ์„ ์œ„ํ•œ ์„ค์ •์„ ๋กœ๋“œํ•œ๋‹ค.

 

โถ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ํด๋”์— .envrc ํŒŒ์ผ ์ƒ์„ฑ (.nvmrc ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋™์ผํ•œ ๊ฒฝ๋กœ)

touch .envrc

 

โท.envrc is blocked... ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜ค๋ฉด direnv allow ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ .envrc ํŒŒ์ผ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•ด์ค€๋‹ค. ๊ถŒํ•œ ํ—ˆ์šฉ ๋ฉ”์‹œ์ง€๋Š” .envrc ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ๋‚˜์˜จ๋‹ค.

direnv allow

 

โธ .envrc ํŒŒ์ผ์— ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋Ÿผ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค .nvmrc ํŒŒ์ผ์— ์ž…๋ ฅํ•œ node ๋ฒ„์ „์œผ๋กœ ์ž๋™ ๋ณ€๊ฒฝ๋œ๋‹ค.

# .envrc
NVM_DIR=$HOME/.nvm # NVM_DIR ๋ณ€์ˆ˜์— ~/.nvm ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ •

# ์กฐ๊ฑด๋ฌธ [[ -e FILE ]] -> FILE์ด ์กด์žฌํ•˜๋ฉด
# ์กฐ๊ฑด๋ฌธ [[ -s FILE ]] -> FILE ์‚ฌ์ด์ฆˆ๊ฐ€ 0 ๋ฐ”์ดํŠธ๋ณด๋‹ค ํฌ๋ฉด
if [ -s $NVM_DIR/nvm.sh ]; then
  source $NVM_DIR/nvm.sh # ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰(์„œ๋ธŒ ์‰˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์‰˜์—์„œ ์‹คํ–‰)
  nvm use
fi
๋”๋ณด๊ธฐ

Stack OverFlow์˜ ๋‹ค๋ฅธ ์„ธํŒ… ์ฝ”๋“œ. ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.

nvmrc=~/.nvm/nvm.sh
if [ -e $nvmrc ]; then
  source $nvmrc
  nvm use
fi

 

`direnv edit` ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ํด๋”์˜ `.envrc` ํŒŒ์ผ์„ ๋ฐ”๋กœ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋•Œ `EDITOR` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋กœ ์—ด๋ฆฐ๋‹ค. ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋กœ ์—ด๊ณ  ์‹ถ๋‹ค๋ฉด `~/.zsrhc` ํŒŒ์ผ์— ์•„๋ž˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

# ~/.zshrc
export EDITOR="code --wait" # VSCode๋กœ ํŽธ์ง‘๊ธฐ ์„ค์ •

 

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€

.envrc ํŒŒ์ผ์— AWS โžŠ์ธ์ฆ ์ •๋ณด ํ˜น์€ โž‹ํ”„๋กœํ•„์„ ์ž…๋ ฅํ•ด์„œ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋งŒ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ธ์ฆ ์ •๋ณด๋ณด๋‹จ AWS ํ”„๋กœํ•„์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•˜๋Š” ๊ฑธ ์ถ”์ฒœ.

# AWS ์ธ์ฆ ์ •๋ณด๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•  ๋•Œ 
export AWS_ACCESS_KEY_ID=ACCOUNT_Y_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=ACCOUNT_Y_SECRET_KEY
export AWS_DEFAULT_REGION=ap-northeast-1

# AWS ํ”„๋กœํ•„์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•  ๋•Œ (์ถ”์ฒœ)
export AWS_PROFILE=ACCOUNT_X
export AWS_DEFAULT_REGION=ap-northeast-1

 

.envrc์— ์ถ”๊ฐ€ํ•ด๋‘” AWS ํ”„๋กœํ•„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ž˜ ๋‚˜์˜จ๋‹ค.

echo $AWS_PROFILE
# ACCOUNT_X

 

PATH ์ถ”๊ฐ€

.envrc์— ์›ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ~/downloads ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, ์›๋žœ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ด์•ผ ํ•˜์ง€๋งŒ...

# .envrc
export PATH="~/downloads:$PATH"

 

.envrc ํŒŒ์ผ์—์„  PATH_add ๊ฒฝ๋กœ ๋งŒ ์ž…๋ ฅํ•˜๋ฉด $PATH ๋ณ€์ˆ˜์— ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.

# .envrc
PATH_add ~/downloads
echo $PATH
# /Users/uesrname/downloads:/usr/local/opt/sqlite/bin:/Users/uesrname/...

 

์ „์—ญ .gitignore ์„ค์ •

.envrc์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ .gitignore ํŒŒ์ผ์— .envrc .direnv๋ฅผ ์ถ”๊ฐ€ํ•ด๋‘”๋‹ค.

# .gitignore
.direnv
.envrc

 

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋งค๋ฒˆ .gitignore ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๋Š”๊ฑด ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งŽ๋‹ค๋ฉด ๊นœ๋นกํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋• ์ „์—ญ(global)์œผ๋กœ .gitignore๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ชจ๋“  ์‹œ์Šคํ…œ์— ์ ์šฉ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿผ ๋งค ํ”„๋กœ์ ํŠธ์˜ .gitignore ํŒŒ์ผ์— ์ผ์ผ์ด ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

# ์‚ฌ์šฉ์ž ํ™ˆ ํด๋”์— .gitignore_global ํŒŒ์ผ ์ƒ์„ฑ
touch ~/.gitignore_global

# ~/.gitignore_global ํŒŒ์ผ์ด core.excludesfile์ด ๋˜๋„๋ก ์„ค์ • (์ „์—ญ .gitignore)
git config --global core.excludesfile ~/.gitignore_global

# ~/.gitignore_global ํŒŒ์ผ์— .envrc์™€ .direnv ์ถ”๊ฐ€
echo '.envrc' >> ~/.gitignore_global # >> ์—ฐ์‚ฐ์ž๋Š” append
echo '.direnv' >> ~/.gitignore_global

 

ํ˜„์žฌ ์‹œ์Šคํ…œ์— ์„ค์ •๋œ core.excludesfile์„ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค

git config --get core.excludesfile
# /Users/username/.gitignore_global
๋”๋ณด๊ธฐ

~/.gitignore_global โ–ผ

# ๋ชจ๋“  ์‹œ์Šคํ…œ์— ์ ์šฉ๋  .gitignore
# ์—ฌ๊ธฐ์— ๋ช…์‹œํ•œ ๊ฒƒ๋“ค์€ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ignore ๋จ

# direnv files
.direnv
.envrc

# editor specific files and folders
.idea
.vscode

# misc
.DS_Store
.vercel
*.pem

 

๋ ˆํผ๋Ÿฐ์Šค


 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•