在 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:$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:$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:$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:$ahead_commits" 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 javascriptimport { 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:${stagedChanges}`; } // Check for unstaged changes const unstagedChanges = await $`git diff --name-only`.text(); if (unstagedChanges !== '') { notPristine = 1; modifiedFiles += `Unstaged changes:${unstagedChanges}`; } // Check for untracked files const untrackedFiles = await $`git ls-files --others --exclude-standard`.text(); if (untrackedFiles !== '') { notPristine = 1; modifiedFiles += `Untracked files:${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:${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 脚本”的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2667951.html