”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 从 shell 脚本迁移到“Bun 脚本”

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

发布于2024-11-06
浏览:692

Migrating from shell script to \

在 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)的调用。

版本声明 本文转载于:https://dev.to/edimarlnx/migrating-from-shell-script-to-bun-script-4pnj?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-05-06
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-05-06
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-05-06
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-06
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-05-06
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    无法连接到mySQL数据库:故障排除错误消息要调试问题,建议将以下代码添加到文件的末尾.//config/database.php并查看输出: ... ... 回声'... echo '<pre>'; print_r($db['default']); echo '</pr...
    编程 发布于2025-05-06
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-05-06
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-05-06
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-05-06
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-05-06
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-05-06
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-05-06
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-05-06
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-05-06
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-05-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3