개발 환경을 실행하는 멋진 방법

여러분 안녕하세요, 제 디스코urs 개발 인스턴스를 실행하는 데 도움이 되는 유용한 스크립트를 하나 공유합니다.

이 스크립트는 최신 변경 사항을 모두 가져오고, 설치된 플러그인에서 업데이트를 받아오며, 모든 마이그레이션을 실행합니다. 또한 필요한 gems와 pnpm 패키지도 설치합니다.

이 스크립트의 단점은 코어에 번들된 플러그인도 함께 가져온다는 점인데, 기술적으로는 첫 번째 git pull 시 업데이트되므로 아무런 영향이 없습니다. 어쨌든 그렇습니다.

참고: if 문 로직을 작성할 때 chatgpt.com의 도움을 받았습니다 (제 초기 시도는 실패했거든요).
~/rundiscourse.sh:

#!/bin/bash

cd ~/discourse
git pull
cd plugins
PLUGIN_DIR=~/discourse/plugins

for folder in "$PLUGIN_DIR"/*; do
  if [ -d "$folder/.git" ]; then
    output=$(git -C "$folder" pull)
    if ! echo "$output" | grep -q "Already up to date."; then
      echo "[$(basename "$folder")] $output"
    fi
  fi
done
cd ~/discourse
bundle install
pnpm install
bin/rails db:migrate
DISCOURSE_HOSTNAME=localhost UNICORN_LISTENER=localhost:3000 bin/ember-cli -u

그런 다음, 다음을 실행하세요:

chmod +x rundiscourse.sh

그 후, ~/.bashrc 파일로 이동하세요 (nano나 다른 편집기를 사용해도 됩니다) 그리고 아직 없다면 이 부분을 추가하세요 (파일 하단 근처에 있습니다)

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

그리고 ~/.bash_aliases 파일에 다음을 추가하세요:

alias discourse="~/rundiscourse.sh"

터미널을 닫고 다시 엽니다.
이제 터미널에서 discourse를 실행하면 개발 환경이 시작되어야 합니다!


이 글이 도움이 되길 바랍니다! 또한 제가 무언가를 잘못하고 있거나 개선할 점이 있다면 알려주세요. 감사합니다!

1개의 좋아요

좋습니다. 몇 가지 제안사항이 있습니다.

shebang은 #!/usr/bin/env sh로 설정하는 것이 가장 호환성이 좋습니다. 스크립트에 bash 전용 기능이 사용되지 않으므로 bash가 아닌 다른 Bourne shell 호환 셸에서도 작동해야 합니다.

shebang 다음에 set -e를 추가하세요. 이렇게 하면 명령어 중 하나라도 실패하면 스크립트가 종료됩니다. 그렇지 않으면 bundle install 실패와 같은 문제로 인해 나중에 실패하더라도 스크립트가 계속 실행되며, 사용자가 화면에서 오류 출력을 볼 수 없게 됩니다.

이제 플러그인 git pull은 STDERR에 기록되는 오류와 실패한 git 실행이 적절히 처리되지 않아 조금 더 문제적입니다. 그래서 STDERR를 STDOUT에도 출력하고 종료 코드를 추적하도록 했습니다.

수많은 cd 명령어나 PLUGIN_DIR 변수 설정은 필요 없습니다.

#!/usr/bin/env sh
set -e

cd ~/discourse
git pull

for folder in plugins/*; do
  if [ -d "$folder/.git" ]; then
    exitcode=0
    output=$(git -C "$folder" pull 2>&1) || exitcode=$?
    if echo "$output" | grep -q -v "Already up to date."; then
      echo "[$(basename "$folder")]"
      echo "$output"
      [ "$exitcode" -ne 0 ] && exit "$exitcode"
    fi
  fi
done

bundle install
pnpm install
bin/rails db:migrate
DISCOURSE_HOSTNAME=localhost UNICORN_LISTENER=localhost:3000 bin/ember-cli -u

이미 유사한 스크립트가 있었는데, 매번 실행되는 것을 원하지 않기 때문에 git pull 부분은 제외하고 있었습니다.

1개의 좋아요

좋은 정보 감사합니다! 한번 시도해 보겠습니다.