从 shell 脚本迁移到“Bun 脚本”

从 shell 脚本迁移到“bun 脚本”

在 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

(0)
上一篇 2025年3月7日 12:25:26
下一篇 2025年3月3日 16:24:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在 Nextjs 项目中通过裁剪和压缩优化图像上传

    作为一名前端开发人员,您很有可能曾经或正在从事涉及发布和显示图像的项目。如果你还没有,那么你很快就会的。因此,最近,当我们完成项目后,我们发现在显示用户提供的图像时遇到了麻烦。 这一切是如何解开的最大的问题是如何处理尺寸,尤其是图像的高度与…

    2025年3月7日
    200
  • Git 中合并的良好实践

    安全合并策略: 我正在学习如何在 git 中进行合并,有 2 个好的实践可以帮助您(如果您也是像我一样的新开发人员)最大程度地减少搞乱 git 历史记录的可能性。 从主分支测试合并:当您在主分支上工作并想要合并功能分支,但又想避免破坏主分支…

    2025年3月7日
    200
  • 即将推出大事

    我决定从头开始构建全栈 Web 开发人员课程,从 HID 一直到服务器和可扩展性。所有需要知道的,都将免费!以下是涵盖的内容: 互联网 互联网是如何运作的?什么是 HTTP?浏览器及其工作原理?DNS 及其工作原理?什么是域名?什么是托管?…

    2025年3月7日
    200
  • 使用 Nodejs 构建实时仪表板

    介绍 在当今快节奏的商业世界中,组织访问实时数据以做出明智的决策至关重要。这就是使用 node.js 构建实时仪表板发挥作用的地方。 node.js 是一种流行的、轻量级的、高效的 javascript 运行时环境,近年来获得了极大的普及。…

    2025年3月7日
    200
  • 如何在Chrome中使用AI实验API

    要在 chrome 中使用实验性 ai api,请按照以下步骤操作: 硬件要求 4gb 内存gpu 可用至少 22gb 空间windows 10.11 或 macos ventura 或更新版本(无 linux 规范) 尚不支持: chro…

    2025年3月7日
    200
  • 又一周又一个特色

    本周我实现了对 @add00_3 制作的 DocBot 的 TOML 支持。第一次听说 TOML,有点惊讶它的存在(我们已经有了 YAML)。实现非常简单,因为代码是用 JavaScript 编写的,并且代码非常易于阅读。尽管我确实花了一分…

    2025年3月7日
    200
  • 如何使用 Git LFS 将大文件推送到 git 存储库

    所以我最近正在做一个项目,我必须使用高分辨率资产,因此它们的尺寸很大。我无法将文件推送到我的存储库。每当我尝试时,我都会收到以下错误: 远程:错误:文件 file.csv 为 182.47 mb​​;这超出了 github 的文件大小限制 …

    2025年3月7日
    200
  • JavaScript (JS) 路线图:快速掌握

    JavaScript (JS) 路线图: 基本原理: 变量、数据类型和运算符。循环和条件等控制结构。功能和范围。 DOM 操作: 使用 JavaScript 访问和修改 HTML 和 CSS。事件处理。 异步编程: 立即学习“Java免费学…

    2025年3月7日
    200
  • 新功能公关

    我有机会为同学的项目做出贡献。他开发了一个聊天完成程序,提供两种服务。第一个服务是 groq,第二个是 google 的 gemini。 解释一下,两者有显着差异。 Google 仅提供 Gemini 及其型号。另一方面,GROQ提供多种型…

    2025年3月7日 编程技术
    200
  • 我的第一篇文章:大家好!!!

    大家好! 作为我的第一篇文章,我想向大家介绍数学创造的艺术中的对称和美丽的世界。 首先我从 Pinterest 获得动力: 所以我问自己是否可以用数学公式来创建它,也许只使用圆规和尺子,或者只是组合正弦曲线,或者使用极坐标(如绘制次摆线等)…

    2025年3月7日
    200

发表回复

登录后才能评论