在 zCloud 从事专注于流程自动化和基础设施的项目时,我们经常遇到需要创建多个函数来执行验证和通用流程的情况。仅使用一种操作系统时一切正常,但当涉及多个系统时情况会变得复杂。
在我们的例子中,大部分开发都发生在 Linux 上,但我们还需要确保与 macOS 的兼容性。这通常会导致代码不兼容。
为了解决这个问题,我们将 shell 脚本函数迁移到 JavaScript 文件,并使用 Bun 作为解释器。我们选择 Bun 因为它提供了一种通过其 Shell API 功能像 shell 一样运行命令的简单方法。
下面是我们用来在应用基础设施修改之前检查任何代码更改的函数示例。
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 }|| [“$ZC_CURRENT_ENV”=“dev”];然后 返回0 菲 本地 not_pristine=0 本地修改文件=“” # 检查已暂存但未提交的更改 staged_changes=$(git diff --name-only --cached) 如果[-n“$staged_changes”];然后 不原始=1 Modified_files =“分阶段更改:\n$staged_changes” 菲 # 检查未暂存的更改 unstaged_changes=$(git diff --仅名称) 如果[-n“$unstaged_changes”];然后 不原始=1 modded_files ="未暂存的更改:\n$unstaged_changes" 菲 # 检查是否有未跟踪的文件 untracked_files=$(git ls-files --others --exclude-standard) 如果[-n“$untracked_files”];然后 不原始=1 modded_files ="未跟踪的文件:\n$untracked_files" 菲 # 检查当前分支是否领先于远程分支 advance_commits=$(git log @{u}.. --oneline) if [ -n "$ahead_commits" ];然后 不原始=1 modded_files ="在远程之前提交:\n$ahead_commits\n\n" 菲 如果 [ $not_pristine -eq 1 ];然后 echo -e“$modified_files” 返回1 菲 返回0 }
为了将此代码转换为 JavaScript,我们在项目的 bin 目录(已在 PATH 中)中创建了一个名为 zc_check_pristine_git 的文件,其中包含以下内容:
#!/usr/bin/env bun // @language JavaScript import { checkPristineGit } from '../js/helpers/helpers.js'; await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });#!/usr/bin/env 面包 // @语言 JavaScript 从 '../js/helpers/helpers.js' 导入 { checkPristineGit } ; 等待 checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });
我们使用 shebang #!/usr/bin/env Bun 来指示我们使用 Bun 作为解释器。
我们添加了注释 // @language JavaScript,以便 IDE 将文件识别为 JavaScript(我们主要使用 Jetbrains 工具)。
然后,我们导入了实际执行的函数。
从shell转换为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 }) => { 错误退出(() => { notEmpty(currentEnv, 'currentEnv 是必需的'); }); if (['staging', 'dev'].includes(currentEnv)) { 返回; } 让 notPristine = 0; 让modifiedFiles = ''; // 检查已暂存但未提交的更改 const stagedChanges = wait $`git diff --name-only --cached`.text(); if (stagedChanges !== '') { 不原始= 1; ModifiedFiles = `分阶段更改:\n${stagedChanges}`; } // 检查未暂存的更改 const unstagedChanges = wait $`git diff --name-only`.text(); if (unstagedChanges !== '') { 不原始= 1; ModifiedFiles = `未暂存的更改:\n${unstagedChanges}`; } // 检查未跟踪的文件 const untrackedFiles = 等待 $`git ls-files --others --exclude-standard`.text(); if (untrackedFiles !== '') { 不原始= 1; moddedFiles = `未跟踪的文件:\n${untrackedFiles}`; } // 检查当前分支是否领先于远程分支 const advanceCommits = 等待 $`git log @{u}.. --oneline`.text(); if (aheadCommits !== '') { 不原始= 1; ModifiedFiles = `在远程之前提交:\n${aheadCommits}`; } 如果(非原始){ console.warn('错误:如果存储库处于原始状态,则只能在生产环境中应用更改。'); console.warn(修改后的文件); 进程.退出(1); } };
这样,我们就有了标准化的 JavaScript 代码,这些代码将像 shell 脚本一样执行。
对提供的示例中未实现的函数(exitOnError、notEmpty)的调用。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3