运行开发环境的好方法

大家好,我来分享一个我编写的实用脚本,它可以帮助我运行 Discourse 的开发实例。

它会拉取所有最新的更改,拉取已安装插件的更新,运行所有迁移,并安装必要的 gem 和 pnpm 包。

脚本的缺点是它还会拉取核心自带的插件,这些插件实际上不会有任何作用,因为它们会随着第一个 git pull 命令一起更新。不过没关系。

注意:chatgpt.com 帮助我编写了 if 语句的逻辑(我最初的尝试失败了)。
~/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 特有的语法,因此它应该可以在任何兼容 Bourne shell 的 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 个赞

谢谢你的见解!我会试试的!