「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > シェル スクリプトから「Bun スクリプト」への移行

シェル スクリプトから「Bun スクリプト」への移行

2024 年 11 月 6 日に公開
ブラウズ:505

Migrating from shell script to \

zCloud でプロセスの自動化とインフラストラクチャに焦点を当てたプロジェクトに取り組んでいるとき、検証と共通のプロセスを実行するために複数の関数を作成する必要性に頻繁に遭遇します。オペレーティング システムが 1 つだけ使用されている場合はすべて問題なく動作しますが、複数のシステムが関係する場合は状況が複雑になります。

私たちの場合、開発のほとんどは Linux 上で行われますが、macOS との互換性も確保する必要があります。これにより、多くの場合、コードの非互換性が発生します。

この問題に対処するために、Bun をインタープリタとして使用して、シェル スクリプト関数を JavaScript ファイルに移行しています。 Bun を選択したのは、シェル API 機能を通じてシェルのようにコマンドを実行する簡単な方法が提供されるためです。

以下は、インフラストラクチャの変更を適用する前にコードの変更をチェックするために使用する関数の例です。

シェルスクリプトコード:

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
}
||

;それから 0を返す フィ ローカルの not_pristine=0 ローカルのmodified_files="" # 段階的だがコミットされていない変更をチェックする staged_changes=$(git diff --name-only --cached) if [ -n "$staged_changes" ];それから not_pristine=1 modified_files ="段階的な変更:\n$staged_changes" フィ # ステージングされていない変更をチェックする unstaged_changes=$(git diff --name-only) if [ -n "$unstaged_changes" ];それから not_pristine=1 modified_files ="ステージングされていない変更:\n$unstaged_changes" フィ # 追跡されていないファイルをチェックする untracked_files=$(git ls-files --others --exclude-standard) if [ -n "$untracked_files" ];それから not_pristine=1 modified_files ="追跡されていないファイル:\n$untracked_files" フィ # 現在のブランチがリモートよりも前にあるかどうかを確認します head_commits=$(git log @{u}.. --oneline) if [ -n "$ahead_commits" ];それから not_pristine=1 modified_files ="リモートより先にコミット:\n$ahead_commits\n\n" フィ if [ $not_pristine -eq 1 ];それから echo -e "$modified_files" 1を返す フィ 0を返す }

このコードを JavaScript に変換するために、次の内容を含む zc_check_pristine_git という名前のファイルをプロジェクトの bin ディレクトリ (すでに PATH 内にあります) に作成しました:
#!/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 // @言語JavaScript import { checkPristineGit } から '../js/helpers/helpers.js'; await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });

Bun をインタプリタとして使用していることを示すために、shebang #!/usr/bin/env bun を使用しました。

IDE がファイルを JavaScript として認識できるように、コメント // @ language JavaScript を追加しました (主に Jetbrains ツールを使用します)。

続いて、実際に実行する関数をインポートしました。
シェルからJavaScriptに変換した関数の実装:

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

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

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

export const checkPristineGit = async ({ currentEnv }) => { exitOnError(() => { notEmpty(currentEnv, 'currentEnv が必要です'); }); if (['staging', 'dev'].includes(currentEnv)) { 戻る; } Pristine = 0 にしないでください。 変更されたファイル = ''; // 段階的だがコミットされていない変更をチェックする const stagedChanges = await $`git diff --name-only --cached`.text(); if (stagedChanges !== '') { notPristine = 1; modifiedFiles = `段階的な変更:\n${stagedChanges}`; } // ステージングされていない変更をチェックする const unstagedChanges = await $`git diff --name-only`.text(); if (unstagedChanges !== '') { notPristine = 1; modifiedFiles = `ステージングされていない変更:\n${unstagedChanges}`; } // 追跡されていないファイルをチェックする const untrackedFiles = await $`git ls-files --others --exclude-standard`.text(); if (untrackedFiles !== '') { notPristine = 1; modifiedFiles = `追跡されていないファイル:\n${untrackedFiles}`; } // 現在のブランチがリモートよりも前にあるかどうかを確認します const headCommits = await $`git log @{u}.. --oneline`.text(); if (aheadCommits !== '') { notPristine = 1; modifiedFiles = `リモートより先にコミットします:\n${aheadCommits}`; } if (notPristine) { console.warn('エラー: リポジトリが初期状態にある場合のみ、変更を実稼働環境に適用できます。'); console.warn(modifiedFiles); プロセス終了(1); } };


このようにして、シェル スクリプトのように実行される標準化された JavaScript コードが完成しました。

提供された例では実装されていない関数の呼び出し (exitOnError、notEmpty) があります。

Migrating from shell script to \

リリースステートメント この記事は次の場所に転載されています: https://dev.to/edimarlnx/migrated-from-shell-script-to-bun-script-4pnj?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3