【踩坑】GitHub Actions 运行的 Linux 环境中,文件名是大小写敏感的

        在使用 VuePress 搭建个人博客并部署到 GitHub Pages 的过程中,我遇到了一个颇为棘手的问题:本地打包一切正常,但在 GitHub Actions 自动执行打包流程时,却提示找不到 README.md 文件,导致整个流程失败。经过一番深入排查和尝试,终于成功解决了这个问题,在此将整个过程记录下来,希望能帮助到遇到类似情况的开发者。

一、问题出现

        我的 VuePress 项目在本地运行 npm run docs:build 时,一切都按预期进行,顺利生成了静态文件,并且我自定义的将根目录下的 README.md 文件复制到构建输出目录的操作也毫无问题。然而,当我将代码推送到 GitHub 仓库后,GitHub Actions 工作流启动,却在执行到复制 README.md 文件这一步时出错,日志中清晰地显示:

        这让我十分困惑,因为 README.mdR 文件确实就存在于项目的根目录下,本地能正常识别,为何在 GitHub Actions 中就找不到了呢?

二、排查过程

(一)初步怀疑文件未正确检出

        首先,我怀疑是 GitHub Actions 在检出代码时出现了问题,导致 README.md 文件没有被正确下载到运行环境中。我检查了工作流中的 actions/checkout 步骤,发现并没有明显的配置错误。不过,为了确保完整检出仓库历史,我在该步骤中添加了 fetch-depth: 0 参数,重新推送代码触发工作流,结果问题依旧存在。

(二)考虑路径差异

        接着,我意识到本地和 GitHub Actions 的运行环境可能存在路径差异。在本地开发时,我习惯了特定的文件路径结构,但 GitHub Actions 运行在 Ubuntu 环境下,其工作目录可能与我预期的不同。为了验证这一点,我在复制文件的 copy-readme.js 脚本中添加了打印当前工作目录的语句:

console.log('当前工作目录:', __dirname);

        重新运行工作流后,从日志中看到工作目录为 /home/runner/work/vivien-blog-code/vivien-blog-code,这与预期相符,说明路径结构本身没有问题。

(三)关注分支情况

        我又想到可能是分支的问题。也许我在本地测试时使用的分支和 GitHub Actions 触发工作流的分支不一致,而 README.md 文件只存在于我本地测试的分支中。仔细检查了工作流配置中的 on.push.branches 字段,发现配置的正是我本地使用的 main 分支,排除了分支不一致的可能性。

(四)检查缓存及权限

        考虑到缓存可能带来的影响,我在工作流中添加了清除 node_modules 缓存的步骤,重新运行后问题仍然没有解决。同时,我也检查了文件权限,在复制文件前添加了设置文件权限的命令 chmod -R 755.,但依旧未能成功。

(五)发现文件名大小写问题

        在几乎排查了所有可能的常规问题后,我突然想到在 Linux 环境下文件名是大小写敏感的。我仔细检查了本地的 README.md 文件,发现文件名中的 .md 部分实际上是大写的,即 README.MD。而我的 copy-readme.js 脚本和 package.json 中的构建脚本都是按照 README.md
来查找文件的,这很可能就是问题的根源!

三、问题解决

(一)修改文件后缀

        我立即将 README.MD 文件名修改为 README.md 

        但这里有个问题,git 是不区分大小写的,所以我改了后缀后推送,发现远程仓库中的文件依然是 README.MD。

        于是,我先把 README.MD 文件给删了,推送一次,再重新创建一个 README.md,推送一次,完美解决

        此时远程仓库中的 README.md 文件也正确了。 

(二)重新推送验证

        修改完成后,我将代码重新推送到 GitHub 仓库。这次,GitHub Actions 工作流顺利运行,成功完成了打包过程,并且 README.md 文件也被正确地复制到了构建输出目录中。困扰我许久的问题终于得到了解决。

四、总结与启示

        这次解决问题的经历让我深刻认识到在跨环境开发和部署过程中,一些看似微不足道的细节可能会引发严重的问题。文件名大小写敏感就是一个很容易被忽视的点,尤其是在本地开发环境(如 Windows)对文件名大小写不敏感的情况下。

        同时,详细的日志记录和逐步排查问题的方法也非常重要,它们能帮助我们快速定位到问题的关键所在,提高解决问题的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 13新特性 - .NET 9

转载: C# 13 中的新增功能 | Microsoft Learn C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能:Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13 C# 13 中的新增功能 | Micr…

numpy.ma.masked_where:屏蔽满足条件的数组

1.函数功能 屏蔽满足条件的数组内容,返回值为掩码数组 2.语法结构 np.ma.masked_where(condition, a, copyTrue)3. 参数 参数含义condition屏蔽条件a要操作的数组copy布尔值,取值为True时,结果复制数组(原始数据不变),否则返回…

【Redis】数据结构和内部编码

先来复习一下之前学过的几个基本的全局命令: keys:用来查看匹配规则的keyexists:用来判定执行key是否存在del:删除指定的keyexpire:给key设置过期时间ttl:查询key的过期时间type:查询key对应的…

OBOO鸥柏如何以智能教育室内外触摸屏一体机AI变革硬件

在AI技术蓬勃发展的当下,OBOO鸥柏室外触摸屏一体机通过融入AI科技,为教育领域带来了翻天覆地的变化。这款一体机不仅为高校和大学校园提供了革命性的数字化教学解决方案,更引领了引体向上成绩提升一体机带训室外终端屏幕设备的新潮流。其创新…

从零搭建高并发体育直播网站:架构设计、核心技术与性能优化实战

本文从技术视角拆解体育直播网站开发全流程,涵盖高并发架构设计、低延迟视频流传输、实时弹幕系统实现等核心模块,并附可复用的代码片段与优化方案。适合中高级开发者进阶实战参考。 一、需求分析与技术选型 1. 典型业务场景 核心需求:支持1…

【Python内置函数的深度解析与应用】id

目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现1. 基础身份验证2. 不可变对象优化3. 对象生命周期追踪 运行结果验证 三、性能对比测试方法论量化数据…

3.vtkProp 和vtkProp3D

文章目录 vtkProp 和vtkProp3D使用vtkProp3D使用vtkPro vtkProp 和vtkProp3D vtkProp 和 vtkProp3D 都是VTK(Visualization Toolkit)库中的类,它们用于在渲染场景中表示可视化元素。理解这两个类的区别和用途对于有效地使用VTK进行三维数据可…

【ZYNQ Linux移植】2-获取设备树

0 写在前面 这是一个系列博客,详细介绍如何在 ZYNQ 与 ZYNQ MP 平台上如何移植 Linux 系统。目前网络上的大部分教程都是全程基于 Petalinux 的开发,虽然这样简化了开发流程,但对于初学者深入理解掌握 Linux 是不利的,所以&#x…

基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)

文章目录 动态规划前言线性dp路径类dp经典线性dp背包问题分类01背包问题完全背包问题多重背包分组背包问题混合背包问题多维费用的背包问题区间dp 动态规划 前言 在竞赛中,如果遇到动态规划的题目,只要不是经典题型,那么大概率就是以压轴题的…

obsidian写文章的图床设置方法

目标 要达成的需求: 复制到obsidian的图片,自动上传到Picgo配置的图床。可以自定义大小。可以一键下载当前文章的图片到本地。 obsidian配置图床 安装并配置插件 image auto upload plugin,配置信息如下图。 滚轮alt自定义大小 安装并…

QPaintDevice绘图设备

1.QPixmap 对不同平台做了显示的优化,可以将画的图保存到磁盘上 头文件: #include"QPixmap" #include"QPainter" 1.1QPixmap画图 代码: //Pixmap绘图设备QPixmap pix(300,300);//声明画家QPainter painter(&pix…

数据结构有哪些类型(对于数据结构的简述)

在学习计算机时,数据结构是不可忽视的一点,从考研时的408课程,再到工作中编写软件,网站,要想在计算机领域站住脚跟,数据结构是必备的 在这里,我对于数据结构进行了汇总,并简要描述&…

L2TP实验(无图后补)

拓扑图 一、搭建拓扑并配置基础 IP 地址 设备选型与拓扑搭建:在 eNSP 中,拖入所需设备,包括 LAC(L2TP Access Concentrator,L2TP 接入集中器 )、LNS(L2TP Network Server,L2TP 网络服…

【C#】CAN通信的使用

在C#中实现CAN通信通常需要借助第三方库或硬件设备的驱动程序,因为C#本身并没有直接内置支持CAN通信的功能。以下是一个关于如何使用C#实现CAN通信的基本指南,包括所需的步骤和常用工具。 1. 硬件准备 要进行CAN通信,首先需要一个支持CAN协…

02_C++入门案例习题while循环练习案例:猜数字

案例描述&#xff1a;系统随机生成一个1到100之间的数字&#xff0c;玩家进行猜测&#xff0c;如果猜错&#xff0c;提示玩家数字过大或过小&#xff0c;如果猜对恭喜玩家胜利&#xff0c;并且退出游戏。 需要引入随机数种子 #include <cstdlib> #include <ctime>…

深入理解哈希冲突:原理、解决方案及 Java 实践

概述&#xff1a;在计算机科学领域&#xff0c;哈希表是一种非常重要的数据结构&#xff0c;它通过哈希函数将键映射到存储桶中&#xff0c;从而实现快速的数据查找、插入和删除操作。然而&#xff0c;哈希表在实际应用中会面临 哈希冲突的问题。本文将深入探讨哈希冲突的原理、…

opencv(C++)处理图像颜色

文章目录 介绍使用策略设计模式比较颜色实现方案计算两个颜色向量之间的距离1. 简单方法&#xff1a;曼哈顿距离计算&#xff08;Manhattan Distance&#xff09;2.使用 OpenCV 的 cv::norm 函数3.使用 OpenCV 的 cv::absdiff 函数错误示例 使用 OpenCV 函数实现颜色检测实现方…

DOM解析XML:Java程序员的“乐高积木式“数据搭建

各位代码建筑师们&#xff01;今天我们要玩一个把XML变成内存乐高城堡的游戏——DOM解析&#xff01;和SAX那种"边看监控边破案"的刺激不同&#xff0c;DOM就像把整个乐高说明书一次性倒进大脑&#xff0c;然后慢慢拼装&#xff08;内存&#xff1a;你不要过来啊&…

Apache Nifi安装与尝试

Apache NIFI中文文档 地址&#xff1a;https://nifichina.github.io/ 下载安装配置 1、环境准备 Nifi的运行需要依赖于java环境&#xff0c;所以本机上需要安装java环境&#xff0c;并配置环境变量。 1.1查看本机是否已经存在java环境 请先执行以下命令找出系统中真实可用…

我可能用到的网站和软件

我可能用到的网站和软件 程序员交流的网站代码管理工具前端组件库前端框架在线工具人工智能问答工具学习的网站Windows系统电脑的常用工具 程序员交流的网站 csdn博客博客园 - 开发者的网上家园InfoQ - 软件开发及相关领域-极客邦掘金 (juejin.cn) 代码管理工具 GitHub 有时…