דרך נחמדה להריץ סביבת פיתוח

Hi everyone, just sharing a handy script I’ve put together that helps me run my Discourse dev instance.

It pulls all the latest changes, pulls the updates from installed plugins, and runs all the migrations, as well as installing the necessary gems and pnpm packages.

The downside to the script is that it also pulls the plugins bundled with core, which technically wouldn’t do anything since they would be updated with the first git pull. Oh well.

Note: chatgpt.com helped me write the if statement logic (my initial experiments failed).
~/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

Then, run:

chmod +x rundiscourse.sh

Then, go to the ~/.bashrc file (using nano, or anything), and add this bit if you don’t already have it (it’s nearer the bottom)

# 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

Then, add the following to the ~/.bash_aliases file:

alias discourse="~/rundiscourse.sh"

Close your terminal and re-open it.
Now, when you run discourse in the terminal, your development environment should start!


I hoped this helped! Also, do let me know if I’m doing something wrong, or if it can be improved. Thanks!

לייק 1

נחמד. כמה הצעות.

ה-shebang צריך להיות #!/usr/bin/env sh, שהוא הכי נייד. הסקריפט לא משתמש בשום דבר ספציפי ל-bash ולכן הוא אמור לעבוד בכל shell תואם Bourne shell, לא רק bash.

אחרי ה-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

תודה על התובנה! אני אנסה את זה!