Boa maneira de executar um ambiente de desenvolvimento

Olá a todos, estou compartilhando um script útil que criei para me ajudar a executar minha instância de desenvolvimento do Discourse.

Ele puxa todas as alterações mais recentes, puxa as atualizações dos plugins instalados e executa todas as migrações, além de instalar os gems e pacotes pnpm necessários.

A desvantagem do script é que ele também puxa os plugins incluídos no core, o que tecnicamente não faria nada, pois seriam atualizados com o primeiro git pull. Ah, bem.

Observação: o chatgpt.com me ajudou a escrever a lógica da instrução if (meus experimentos iniciais falharam).
~/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

Em seguida, execute:

chmod +x rundiscourse.sh

Em seguida, vá para o arquivo ~/.bashrc (usando nano ou qualquer outro editor) e adicione este trecho se você ainda não o tiver (está mais perto do final)

# 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

Em seguida, adicione o seguinte ao arquivo ~/.bash_aliases:

alias discourse="~/rundiscourse.sh"

Feche seu terminal e reabra-o.
Agora, quando você executar discourse no terminal, seu ambiente de desenvolvimento deverá iniciar!


Espero que isso tenha ajudado! Além disso, por favor, me avisem se estou fazendo algo errado ou se pode ser melhorado. Obrigado!

1 curtida

Legal. Algumas sugestões.

O shebang deve ser #!/usr/bin/env sh, que é o mais portável. O script não usa nenhum bashismo, então deve funcionar em qualquer shell compatível com Bourne shell, não apenas bash.

Após o shebang, adicione set -e. Isso fará com que o script saia se algum dos comandos falhar. Caso contrário, ele continuará executando comandos e falhando mais tarde porque algo como bundle install falhou, e a saída de erro desapareceu da tela do usuário.

Agora, o git pull do plugin é um pouco mais problemático, pois erros escritos em STDERR e uma execução git falha não serão tratados adequadamente. Então, enviei STDERR também para STDOUT e acompanhei o código de saída.

Não há necessidade de um monte de comandos cd, ou de definir a variável 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

Eu já tinha um script semelhante, exceto pelo git pulling, pois não quero que isso aconteça toda vez.

1 curtida

Obrigado pela informação! Vou tentar isso!