96 lines
3.6 KiB
Python
96 lines
3.6 KiB
Python
|
|
import os
|
|||
|
|
|
|||
|
|
# ==========================================
|
|||
|
|
# 設定區
|
|||
|
|
# ==========================================
|
|||
|
|
# 輸出的合併檔案名稱
|
|||
|
|
OUTPUT_FILE = "all_code.txt"
|
|||
|
|
|
|||
|
|
# ⚠️ 嚴格排除的資料夾 (完全不掃描這些目錄)
|
|||
|
|
EXCLUDE_DIRS = {
|
|||
|
|
"__pycache__",
|
|||
|
|
".git",
|
|||
|
|
".vscode", # VS Code 設定檔
|
|||
|
|
".continue", # Continue.dev 設定檔
|
|||
|
|
"cmts_api_env", # 🚨 Python 虛擬環境 (極度重要!絕對要排除)
|
|||
|
|
"venv", # 其他常見的虛擬環境名稱
|
|||
|
|
".venv",
|
|||
|
|
"node_modules",
|
|||
|
|
"dist",
|
|||
|
|
"build"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ⚠️ 排除的檔案副檔名 (不讀取這些格式)
|
|||
|
|
EXCLUDE_EXTENSIONS = {
|
|||
|
|
".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg", # 圖片
|
|||
|
|
".pyc", ".pyo", ".pyd", # Python 編譯檔
|
|||
|
|
".exe", ".dll", ".so", ".dylib", # 執行檔/函式庫
|
|||
|
|
".zip", ".tar", ".gz", ".rar", # 壓縮檔
|
|||
|
|
".pdf", ".doc", ".docx", # 文件檔
|
|||
|
|
".sqlite3", ".db" # 資料庫
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ⚠️ 排除的特定檔案名稱 (例如腳本自己、隱藏檔等)
|
|||
|
|
EXCLUDE_FILES = {
|
|||
|
|
"merge_code.py", # 排除這支腳本自己
|
|||
|
|
"all_code.txt", # 排除輸出的檔案
|
|||
|
|
".DS_Store", # Mac 系統檔
|
|||
|
|
".clineignore", # AI 輔助工具的忽略檔
|
|||
|
|
".clinerules", # AI 輔助工具的規則檔
|
|||
|
|
".gitignore", # Git 忽略檔
|
|||
|
|
"requirements.txt" # 依賴清單 (通常不需要給 AI 看,除非你要問套件問題)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def should_process_file(filename):
|
|||
|
|
"""判斷該檔案是否應該被處理"""
|
|||
|
|
if filename in EXCLUDE_FILES:
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
ext = os.path.splitext(filename)[1].lower()
|
|||
|
|
if ext in EXCLUDE_EXTENSIONS:
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
def merge_files():
|
|||
|
|
# 取得當前腳本所在的目錄 (專案根目錄)
|
|||
|
|
root_dir = os.path.dirname(os.path.abspath(__file__))
|
|||
|
|
|
|||
|
|
with open(OUTPUT_FILE, "w", encoding="utf-8") as outfile:
|
|||
|
|
# 寫入一個總標題
|
|||
|
|
outfile.write("=" * 80 + "\n")
|
|||
|
|
outfile.write("PROJECT SOURCE CODE EXPORT\n")
|
|||
|
|
outfile.write("=" * 80 + "\n\n")
|
|||
|
|
|
|||
|
|
# 走訪目錄
|
|||
|
|
for dirpath, dirnames, filenames in os.walk(root_dir):
|
|||
|
|
# 排除不需要的目錄 (原地修改 dirnames 列表,os.walk 就不會進去)
|
|||
|
|
dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIRS]
|
|||
|
|
|
|||
|
|
for filename in filenames:
|
|||
|
|
if should_process_file(filename):
|
|||
|
|
file_path = os.path.join(dirpath, filename)
|
|||
|
|
# 計算相對路徑 (例如: routers/config.py)
|
|||
|
|
rel_path = os.path.relpath(file_path, root_dir)
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
with open(file_path, "r", encoding="utf-8") as infile:
|
|||
|
|
content = infile.read()
|
|||
|
|
|
|||
|
|
# 寫入漂亮的檔名標籤
|
|||
|
|
outfile.write("\n" + "=" * 80 + "\n")
|
|||
|
|
outfile.write(f"FILE: {rel_path}\n")
|
|||
|
|
outfile.write("=" * 80 + "\n")
|
|||
|
|
# 寫入檔案內容
|
|||
|
|
outfile.write(content)
|
|||
|
|
outfile.write("\n")
|
|||
|
|
|
|||
|
|
print(f"✅ 已合併: {rel_path}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ 讀取失敗 {rel_path}: {e}")
|
|||
|
|
|
|||
|
|
print(f"\n🎉 合併完成!所有程式碼已儲存至: {OUTPUT_FILE}")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
merge_files()
|