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を返す
}
#!/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); } };
提供された例では実装されていない関数の呼び出し (exitOnError、notEmpty) があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3