背景
由于近期工作有所变化,自己的电脑要从头开始安装一些开发工具,需要安装 git, nvm,nodejs,omz 等等。下载安装这些虽然不难,但是还是会花一些时间去找地址,再执行命令行开始下载安装。那么问题来了,这个时候能否使用 shell 脚本自动执行下载安装,下楼买个咖啡回来,一切安装完毕岂不美哉。俗话说的好,不会“偷懒”的工程师不是一个好的程序员。
而当编写好这个 shell 工具后,不仅可以一键下载安装必备开发工具,又可以将对应的代码提交到 GitHub 平台,在下次需要装基础开发环境的时候就能直接复用;其次,当其他开发者看到并使用的时候,也可以为他人提升效率。
因此,在有了这个想法之后我就着手去写了这个 shell 工具并最终发布到 GitHub 上,参见 easy-install。接下来会大致阐述自己的整个开发过程和一些踩坑经历,具体的一些使用细节不做过多赘述。
准备
由于需要编写 Shell,因此基本的语法是要弄清楚并掌握的。现在网上的教程很多,这里就不作过多说明了。在编写前需要准备的工具:vscode,bash,docker,git。
Docker
一般来说,在 macOS 或者 Linux 系统下开发软件相对来说 docker 是开发工具必备之一。在编写 shell 前可以先熟悉下 docker 的安装和使用教程,使用 docker 的命令安装 centos 镜像,命令行如下:
docker pull centos
VSCode
VScode 的下载地址参见:https://code.visualstudio.com/,根据当前系统环境安装对应的版本。安装好之后,打开编辑器首先设置 code 全局命令。在下次使用时,可以直接使用 code 命令打开编辑器。
Git
下载并安装好 Git 工具,并在 GitHub 上创建好一个仓库,使用 git clone 命令将仓库克隆到本地,进入仓库对应的根目录内新增一个开发分支,使用 code . 命令打开编辑器开始编写 shell
开发 & 调试 & 测试
本地开发
作为一个前端开发者,本地必须要安装的工具有:git,nvm,nodejs, oh-my-zsh,homebrew 等,因此这个 shell 工具至少要帮我自动安装上述相关工具。这个 时候就尽量选择快捷方便的方式去下载和安装这些工具,比如 Git 在 macOS 上可以使用 xcode 来快速安装;而在 centos 可以使用 yum 来安装。
在本地开发期间,尽可能保证环境和真实环境的一致性,可以多开几个 terminal 窗口,一边测试单行命令,一边在编辑器内增加脚本代码。
脚本调试
在初步编写好脚本后,可在启动的 docker 容器内直接创建 .sh 文件并运行。由于 shell 命令都是串行运行,因此不用刻意考虑异步场景的情况,必要时需要调整相关命令行顺序。
测试
在完成本地初步的命令测试后,就可以在镜像容器内开始整个测试流程了。整体的命令如下:
docker run -it centos /bin/bash
cd root
curl -o- https://raw.githubusercontent.com/CasoMemory/easy-install/develop/shell.sh | bash
上述的远程文件地址可通过切换到 raw 的模式查看最终的显示地址,如下图所示:
接着就是开始观察终端显示的信息,等待最终的安装结果。当终端最终显示 "Congratulations! All tools installed!",无任何报错时,就表明整个 shell 工具开发测试完成。
一些踩坑经历
- 在编写 shell 脚本时,如果是在 Windows 环境,需要注意相关换行字符的统一。在 Windows 下默认为 CRLF,在运行 shell 脚本时是会报语法错误的,此时要注意设置为 LF,参见下图:
- centos 镜像内一些基本的指令是没有,比如:sudo, chsh, zsh 等,这个时候容易出现安装一些工具时会因为命令不存在导致下载失败。因此可以检查相关命令是否存在并去安装。由于 centos 内置了 yum 软件下载管理工具,可以使用 yum 下载来安装。
- 在调试时,尽量开启加速器,有些时候 raw.githubusercontent.com 域名会出现一些不稳定的情况,必要时可增加域名 IP 绑定。
发布
在完成整体开发和测试后,就可以将开发分支代码合并到 main 分支。在正式合并前,提前准备 readme 文档,尽量使用英文去描述。使用英文的好处就是,不仅可以锻炼自己的英文写作能力,也能让更多的国外开发者看明白工具的介绍和使用方式,间接增加自己的影响力。
总结
以上是我在开发 easy-install 的时候整个实战经历,不仅学习并熟悉使用 shell,又学习和使用了 docker 的功能。整体上来说编写 easy-install 让我再一次找到了学习的乐趣,推动一个人的成长,往往更多的是乐趣和热爱。更多热爱,更多成长,努力成就更好的自己!