【踩坑】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.pswp.cn/web/75750.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75750.shtml
英文地址,請注明出處:http://en.pswp.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 有時…