Refactor Windows build to use cx_Freeze setup script

Replaces direct cx_Freeze CLI calls with dynamically generated setup scripts for both standard and FFmpeg builds. This improves maintainability and flexibility of build configuration in the GitHub Actions workflow.
This commit is contained in:
Your Name
2025-09-09 14:35:45 +03:00
parent 4434eafe48
commit 2f0b4b9334
+80 -22
View File
@@ -62,6 +62,79 @@ jobs:
echo "VERSION=$version" >> $env:GITHUB_ENV echo "VERSION=$version" >> $env:GITHUB_ENV
Write-Host "Prepared build variables for version: $version" Write-Host "Prepared build variables for version: $version"
- name: Create cx_Freeze setup script
shell: powershell
run: |
# Create setup script for cx_Freeze
New-Item -Path "setup_cxfreeze.py" -ItemType File -Force
Add-Content -Path "setup_cxfreeze.py" -Value "import os"
Add-Content -Path "setup_cxfreeze.py" -Value "from cx_Freeze import setup, Executable"
Add-Content -Path "setup_cxfreeze.py" -Value ""
Add-Content -Path "setup_cxfreeze.py" -Value 'version = os.environ.get("VERSION", "0.0.0")'
Add-Content -Path "setup_cxfreeze.py" -Value ""
Add-Content -Path "setup_cxfreeze.py" -Value "build_exe_options = dict("
Add-Content -Path "setup_cxfreeze.py" -Value " optimize=2,"
Add-Content -Path "setup_cxfreeze.py" -Value " packages=["
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtCore",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtGui",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWidgets",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "requests",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PIL",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "packaging",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "markdown",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "pyglet",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "loguru",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "setuptools",'
Add-Content -Path "setup_cxfreeze.py" -Value " ],"
Add-Content -Path "setup_cxfreeze.py" -Value " excludes=["
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtBluetooth",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtNetwork",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtOpenGL",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtPrintSupport",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtSvg",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtTest",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtXml",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtSql",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtHelp",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtMultimedia",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtQml",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtQuick",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWebEngineCore",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PIL.ImageDraw",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "PIL.ImageFont",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "numpy",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "scipy",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "wx",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "pandas",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "tkinter",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "yt_dlp",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "unittest",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "test",'
Add-Content -Path "setup_cxfreeze.py" -Value ' "tests",'
Add-Content -Path "setup_cxfreeze.py" -Value " ],"
Add-Content -Path "setup_cxfreeze.py" -Value " include_files=["
Add-Content -Path "setup_cxfreeze.py" -Value ' ("src", "src"),'
Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets", "lib/assets"),'
Add-Content -Path "setup_cxfreeze.py" -Value " ],"
Add-Content -Path "setup_cxfreeze.py" -Value ")"
Add-Content -Path "setup_cxfreeze.py" -Value ""
Add-Content -Path "setup_cxfreeze.py" -Value "executables = ["
Add-Content -Path "setup_cxfreeze.py" -Value " Executable("
Add-Content -Path "setup_cxfreeze.py" -Value ' script="main.py",'
Add-Content -Path "setup_cxfreeze.py" -Value ' target_name=f"YTSage-v{version}.exe",'
Add-Content -Path "setup_cxfreeze.py" -Value ' base="Win32GUI",'
Add-Content -Path "setup_cxfreeze.py" -Value ' icon="assets/branding/icons/YTSage.ico",'
Add-Content -Path "setup_cxfreeze.py" -Value " )"
Add-Content -Path "setup_cxfreeze.py" -Value "]"
Add-Content -Path "setup_cxfreeze.py" -Value ""
Add-Content -Path "setup_cxfreeze.py" -Value "setup("
Add-Content -Path "setup_cxfreeze.py" -Value ' name="YTSage",'
Add-Content -Path "setup_cxfreeze.py" -Value " version=version,"
Add-Content -Path "setup_cxfreeze.py" -Value ' description="YTSage",'
Add-Content -Path "setup_cxfreeze.py" -Value ' options={"build_exe": build_exe_options},'
Add-Content -Path "setup_cxfreeze.py" -Value " executables=executables,"
Add-Content -Path "setup_cxfreeze.py" -Value ")"
- name: Build Standard Version (ZIP) - name: Build Standard Version (ZIP)
shell: powershell shell: powershell
run: | run: |
@@ -74,17 +147,8 @@ jobs:
if (Test-Path "build\bdist.*") { Remove-Item "build\bdist.*" -Recurse -Force } if (Test-Path "build\bdist.*") { Remove-Item "build\bdist.*" -Recurse -Force }
if (Test-Path "dist") { Remove-Item "dist" -Recurse -Force } if (Test-Path "dist") { Remove-Item "dist" -Recurse -Force }
# Build executable using cx_Freeze CLI (use python -m to ensure proper base handling) # Build executable using setup script
python -m cx_Freeze main.py ` python setup_cxfreeze.py build_exe --build-exe "dist\YTSage"
--target-dir "dist\YTSage" `
--base-name Win32GUI `
--icon "assets\branding\icons\YTSage.ico" `
--target-name "YTSage-v$version.exe" `
--optimize 2 `
--packages "PySide6.QtCore,PySide6.QtGui,PySide6.QtWidgets,requests,PIL,packaging,markdown,pyglet,loguru,setuptools" `
--excludes "PySide6.QtBluetooth,PySide6.QtNetwork,PySide6.QtOpenGL,PySide6.QtPrintSupport,PySide6.QtSvg,PySide6.QtTest,PySide6.QtXml,PySide6.QtSql,PySide6.QtHelp,PySide6.QtMultimedia,PySide6.QtQml,PySide6.QtQuick,PySide6.QtWebEngineCore,PIL.ImageDraw,PIL.ImageFont,numpy,scipy,wx,pandas,tkinter,yt_dlp,unittest,test,tests" `
--include-files "src" `
--include-files "assets:lib/assets"
# Remove screenshots folder to reduce build size # Remove screenshots folder to reduce build size
if (Test-Path "dist\YTSage\lib\assets\branding\screenshots") { if (Test-Path "dist\YTSage\lib\assets\branding\screenshots") {
@@ -153,17 +217,11 @@ jobs:
if (Test-Path "build\exe.*") { Remove-Item "build\exe.*" -Recurse -Force } if (Test-Path "build\exe.*") { Remove-Item "build\exe.*" -Recurse -Force }
if (Test-Path "build\bdist.*") { Remove-Item "build\bdist.*" -Recurse -Force } if (Test-Path "build\bdist.*") { Remove-Item "build\bdist.*" -Recurse -Force }
# Build executable with FFmpeg using cx_Freeze CLI (use python -m to ensure proper base handling) # Create modified setup script for FFmpeg version
python -m cx_Freeze main.py ` (Get-Content "setup_cxfreeze.py") -replace 'YTSage-v\{version\}\.exe', 'YTSage-v{version}-ffmpeg.exe' | Set-Content "setup_cxfreeze_ffmpeg.py"
--target-dir "dist\YTSage-FFmpeg" `
--base-name Win32GUI ` # Build executable with FFmpeg using setup script
--icon "assets\branding\icons\YTSage.ico" ` python setup_cxfreeze_ffmpeg.py build_exe --build-exe "dist\YTSage-FFmpeg"
--target-name "YTSage-v$version-ffmpeg.exe" `
--optimize 2 `
--packages "PySide6.QtCore,PySide6.QtGui,PySide6.QtWidgets,requests,PIL,packaging,markdown,pyglet,loguru,setuptools" `
--excludes "PySide6.QtBluetooth,PySide6.QtNetwork,PySide6.QtOpenGL,PySide6.QtPrintSupport,PySide6.QtSvg,PySide6.QtTest,PySide6.QtXml,PySide6.QtSql,PySide6.QtHelp,PySide6.QtMultimedia,PySide6.QtQml,PySide6.QtQuick,PySide6.QtWebEngineCore,PIL.ImageDraw,PIL.ImageFont,numpy,scipy,wx,pandas,tkinter,yt_dlp,unittest,test,tests" `
--include-files "src" `
--include-files "assets:lib/assets"
# Remove screenshots folder to reduce build size # Remove screenshots folder to reduce build size
if (Test-Path "dist\YTSage-FFmpeg\lib\assets\branding\screenshots") { if (Test-Path "dist\YTSage-FFmpeg\lib\assets\branding\screenshots") {