"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Migrando do shell script para "Bun script"

Migrando do shell script para "Bun script"

Publicado em 2024-11-06
Navegar:177

Migrating from shell script to \

Ao trabalhar em um projeto focado em automação de processos e infraestrutura no zCloud, frequentemente nos deparamos com a necessidade de criar múltiplas funções para realizar validações e processos comuns. Tudo funciona bem quando se utiliza apenas um sistema operacional, mas a situação fica complicada quando mais de um sistema está envolvido.

No nosso caso, a maior parte do desenvolvimento acontece no Linux, mas também precisamos garantir a compatibilidade com o macOS. Isso geralmente resulta em incompatibilidades de código.

Para resolver esse problema, estamos migrando nossas funções de script de shell para arquivos JavaScript, usando Bun como intérprete. Escolhemos o Bun porque ele fornece uma maneira simples de executar comandos como um shell por meio de sua funcionalidade Shell API.

Abaixo está um exemplo de uma função que usamos para verificar quaisquer alterações no código antes de aplicar modificações na infraestrutura.

Código do script de shell:

function zc_check_pristine_git() {
    if [ "$ZC_CURRENT_ENV" = "staging" ] || [ "$ZC_CURRENT_ENV" = "dev" ]; then
      return 0
    fi

    local not_pristine=0
    local modified_files=""

    # Check for staged but uncommitted changes
    staged_changes=$(git diff --name-only --cached)
    if [ -n "$staged_changes" ]; then
        not_pristine=1
        modified_files ="Staged changes:\n$staged_changes"
    fi

    # Check for unstaged changes
    unstaged_changes=$(git diff --name-only)
    if [ -n "$unstaged_changes" ]; then
        not_pristine=1
        modified_files ="Unstaged changes:\n$unstaged_changes"
    fi

    # Check for untracked files
    untracked_files=$(git ls-files --others --exclude-standard)
    if [ -n "$untracked_files" ]; then
        not_pristine=1
        modified_files ="Untracked files:\n$untracked_files"
    fi

    # Check if the current branch is ahead of the remote
    ahead_commits=$(git log @{u}.. --oneline)
    if [ -n "$ahead_commits" ]; then
        not_pristine=1
        modified_files ="Commits ahead of the remote:\n$ahead_commits\n\n"
    fi

    if [ $not_pristine -eq 1 ]; then
        echo -e "$modified_files"
        return 1
    fi

    return 0
}
||

; então retornar 0 fi local not_pristine=0 arquivos_modificados locais = "" # Verifica se há alterações preparadas, mas não confirmadas staged_changes=$(git diff --name-only --cached) if [ -n "$staged_changes"]; então not_pristine=1 modificado_files ="Alterações preparadas:\n$staged_changes" fi # Verifique se há alterações não planejadas unstaged_changes=$(git diff --name-only) if [ -n "$unstaged_changes"]; então not_pristine=1 modificado_files ="Alterações não preparadas:\n$unstaged_changes" fi # Verifique se há arquivos não rastreados untracked_files=$(git ls-files --others --exclude-standard) if [ -n "$untracked_files"]; então not_pristine=1 modificado_files ="Arquivos não rastreados:\n$untracked_files" fi # Verifica se a filial atual está à frente da remota ahead_commits=$(git log @{u}.. --oneline) se [ -n "$ahead_commits"]; então not_pristine=1 modificado_files ="Commit antes do controle remoto:\n$ahead_commits\n\n" fi se [$not_pristine -eq 1]; então echo -e "$arquivos_modificados" retornar 1 fi retornar 0 }

Para converter este código para JavaScript, criamos um arquivo chamado zc_check_pristine_git no diretório bin do projeto (que já está no PATH) com o seguinte conteúdo:
#!/usr/bin/env bun
// @language JavaScript

import { checkPristineGit } from '../js/helpers/helpers.js';

await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });

#!/usr/bin/env bun // @linguagem JavaScript importar { checkPristineGit } de '../js/helpers/helpers.js'; aguarde checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });

Usamos o shebang #!/usr/bin/env bun para indicar que estamos usando Bun como intérprete.

Adicionamos o comentário // @linguagem JavaScript para que o IDE reconheça o arquivo como JavaScript (usamos principalmente ferramentas Jetbrains).

Em seguida, importamos a função que realmente será executada.
Implementação da função convertida de shell para JavaScript:

#!/usr/bin/env bun
// @language JavaScript

import { checkPristineGit } from '../js/helpers/helpers.js';

await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });

exportar const checkPristineGit = async ({ currentEnv }) => { exitOnError(() => { notEmpty(currentEnv, 'currentEnv é obrigatório'); }); if (['staging', 'dev'].includes(currentEnv)) { retornar; } deixe notPristine = 0; deixe arquivos modificados = ''; // Verifica se há alterações preparadas, mas não confirmadas const stagedChanges = aguarda $`git diff --name-only --cached`.text(); if (stagedChanges! == '') { nãoPristine = 1; modificadoFiles = `Alterações preparadas:\n${stagedChanges}`; } //Verifica se há alterações não preparadas const unstagedChanges = aguarda $`git diff --name-only`.text(); if (unstagedChanges! == '') { nãoPristine = 1; modificadoFiles = `Alterações não preparadas:\n${unstagedChanges}`; } //Verifica se há arquivos não rastreados const untrackedFiles = aguarda $`git ls-files --others --exclude-standard`.text(); if (arquivos não rastreados! == '') { nãoPristine = 1; modificadoFiles = `Arquivos não rastreados:\n${untrackedFiles}`; } // Verifica se o branch atual está à frente do remoto const aheadCommits = aguarda $`git log @{u}.. --oneline`.text(); if (aheadCommits! == '') { nãoPristine = 1; modificadoFiles = `Commit antes do remoto:\n${aheadCommits}`; } if (notPristine) { console.warn('Erro: Você só pode aplicar alterações em ambientes de produção se o repositório estiver em estado original.'); console.warn (arquivos modificados); processo.exit(1); } };


Dessa forma, padronizamos o código JavaScript que será executado como um script de shell.

Existem chamadas para funções (exitOnError, notEmpty) que não são implementadas no exemplo fornecido.

Migrating from shell script to \

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/edimarlnx/migrating-from-shell-script-to-bun-script-4pnj?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3