在 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 脚本”的详细内容,更多请关注抖狐科技其它相关文章!
-
重返未来1999最新2.2版本T0角色一览
重返未来1999 2.2版本强势角色揭秘重返未来1999 2.2版本的更新带来了新角色和老角色调整,对于当前的强力角色,许多玩家心中充满了疑惑。php小编小新特此整理了最新版本中的t0角色,为各位玩家...
-
小红书和抖音矩阵的区别
小红书是一个以生活分享和商品种草为主的社区,注重图片和文字内容,目标用户主要为年轻女性。抖音则是一个以短视频为主的平台,内容类型多样,娱乐性更强,全年龄段用户都有涉及。企业选择平台时应根据目标用户和业...
-
爱奇艺可以几个设备登录
爱奇艺同一账号最多可同时登录3台设备,支持手机、平板电脑、电脑、电视等多种设备类型。爱奇艺可以几个设备同时登录? 爱奇艺支持同一账号在3台设备上同时登录。 设备类型限制:手机(iOS/Android)...
-
《重装岚影:重生》登陆Steam 吸幸类型动作射击
SmokingBear Studio工作室制作并发行,又一款火爆刺激的吸幸类型动作射击新游《重装岚影:重生》登陆Steam正式推出,本作支持中文,限时八折优惠,感兴趣的玩家可以关注下。《重装岚影:重生...
-
Win11xbox game bar打不开怎么办 Win11xbox game bar打不开解决方法
当您在 windows 11 中遇到 xbox game bar 无法启动的问题时,这可能会令人沮丧。如果您遇到了这种情况,请不要担心,因为 php小编新一 已编译了一份全面的指南来帮助您解决这个问题...