在 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 }
为了将此代码转换为 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 });
我们使用 shebang #!/usr/bin/env Bun 来表明我们正在使用 Bun 作为解释器。
我们添加了注释 // @language JavaScript,以便 IDE 将文件识别为 JavaScript(我们主要使用 Jetbrains 工具)。
然后,我们导入了实际执行的函数。
从 shell 转换为 JavaScript 的函数的实现:
export const checkPristineGit = async ({ currentEnv }) => { exitOnError(() => { notEmpty(currentEnv, 'currentEnv is required'); }); if (['staging', 'dev'].includes(currentEnv)) { return; } let notPristine = 0; let modifiedFiles = ''; // Check for staged but uncommitted changes const stagedChanges = await $`git diff --name-only --cached`.text(); if (stagedChanges !== '') { notPristine = 1; modifiedFiles += `Staged changes:\n${stagedChanges}`; } // Check for unstaged changes const unstagedChanges = await $`git diff --name-only`.text(); if (unstagedChanges !== '') { notPristine = 1; modifiedFiles += `Unstaged changes:\n${unstagedChanges}`; } // Check for untracked files const untrackedFiles = await $`git ls-files --others --exclude-standard`.text(); if (untrackedFiles !== '') { notPristine = 1; modifiedFiles += `Untracked files:\n${untrackedFiles}`; } // Check if the current branch is ahead of the remote const aheadCommits = await $`git log @{u}.. --oneline`.text(); if (aheadCommits !== '') { notPristine = 1; modifiedFiles += `Commits ahead of the remote:\n${aheadCommits}`; } if (notPristine) { console.warn('Error: You can only apply changes in production environments if the repository is in a pristine state.'); console.warn(modifiedFiles); process.exit(1); } };
这样,我们就标准化了 JavaScript 代码,这些代码将像 shell 脚本一样执行。
对提供的示例中未实现的函数(exitOnError、notEmpty)的调用。
以上是从 shell 脚本迁移到“Bun 脚本”的详细内容。更多信息请关注PHP中文网其他相关文章!