Добавлены скрипты сборки для кроссплатформенных двоичных файлов и лицензия GPL.

- Добавлен файл LICENSE с лицензией GNU General Public License версии 3.0.
- Создан скрипт PowerShell (build-all.ps1) для сборки двоичных файлов Windows и Linux из Windows с использованием кросс-компиляции.
- Разработан скрипт сборки Linux (build-linux.sh) для сборки двоичных файлов Linux.
- Реализован скрипт PowerShell (build-windows.ps1) для сборки двоичных файлов Windows.
- Каждый скрипт сборки включает упаковку и генерацию контрольной суммы SHA256 для двоичных файлов.
This commit is contained in:
Dmitriy Fofanov
2025-11-05 13:05:49 +03:00
parent 77af408c9e
commit eee9a4a093
33 changed files with 1091 additions and 126 deletions

117
scripts/build-all.ps1 Normal file
View File

@@ -0,0 +1,117 @@
# Universal build script for all platforms
# Builds Windows and Linux binaries from Windows using cross-compilation
# Usage: .\scripts\build-all.ps1
# Exit on error
$ErrorActionPreference = "Stop"
# Read version from VERSION file
$VERSION = Get-Content -Path "VERSION" -Raw
$VERSION = $VERSION.Trim()
$BINARY = "compress"
$OUTPUT_DIR = "dist"
Write-Host "Building compress $VERSION for all platforms..." -ForegroundColor Green
# Create output directory if it doesn't exist
if (-Not (Test-Path $OUTPUT_DIR)) {
New-Item -ItemType Directory -Path $OUTPUT_DIR | Out-Null
}
# Build configurations
$platforms = @(
@{OS="windows"; ARCH="amd64"; EXT=".exe"},
@{OS="windows"; ARCH="arm64"; EXT=".exe"},
@{OS="linux"; ARCH="amd64"; EXT=""},
@{OS="linux"; ARCH="arm64"; EXT=""}
)
foreach ($platform in $platforms) {
Write-Host "`nBuilding $($platform.OS) $($platform.ARCH)..." -ForegroundColor Cyan
$env:CGO_ENABLED = "0"
$env:GOOS = $platform.OS
$env:GOARCH = $platform.ARCH
$outputName = "$OUTPUT_DIR\${BINARY}-$($platform.OS)-$($platform.ARCH)$($platform.EXT)"
go build -ldflags "-s -w" -o $outputName .\cmd
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to build $($platform.OS) $($platform.ARCH)"
exit 1
}
Write-Host "Success: $($platform.OS) $($platform.ARCH) built successfully" -ForegroundColor Green
}
# Clean up environment variables
Remove-Item Env:CGO_ENABLED -ErrorAction SilentlyContinue
Remove-Item Env:GOOS -ErrorAction SilentlyContinue
Remove-Item Env:GOARCH -ErrorAction SilentlyContinue
Write-Host "`nPackaging releases..." -ForegroundColor Green
# Package Windows releases
foreach ($arch in @("amd64", "arm64")) {
Write-Host "Packaging Windows $arch..." -ForegroundColor Cyan
$tempDir = New-Item -ItemType Directory -Path "$OUTPUT_DIR\temp-windows-$arch" -Force
Copy-Item "$OUTPUT_DIR\${BINARY}-windows-${arch}.exe" "$tempDir\${BINARY}.exe"
Copy-Item "LICENSE" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "README.md" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "config.yaml.example" "$tempDir\" -ErrorAction SilentlyContinue
$archiveName = "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-${arch}.zip"
Compress-Archive -Path "$tempDir\*" -DestinationPath $archiveName -Force
Remove-Item $tempDir -Recurse -Force
Remove-Item "$OUTPUT_DIR\${BINARY}-windows-${arch}.exe"
# Generate SHA256
$hash = Get-FileHash $archiveName -Algorithm SHA256 | Select-Object -ExpandProperty Hash
$hash | Out-File "$archiveName.sha256" -Encoding ASCII
Write-Host "Created: $archiveName" -ForegroundColor Yellow
}
# Package Linux releases
foreach ($arch in @("amd64", "arm64")) {
Write-Host "Packaging Linux $arch..." -ForegroundColor Cyan
$tempDir = New-Item -ItemType Directory -Path "$OUTPUT_DIR\temp-linux-$arch" -Force
Copy-Item "$OUTPUT_DIR\${BINARY}-linux-${arch}" "$tempDir\${BINARY}"
Copy-Item "LICENSE" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "README.md" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "config.yaml.example" "$tempDir\" -ErrorAction SilentlyContinue
# Use tar via WSL or tar.exe if available
$archiveName = "${BINARY}-${VERSION}-linux-${arch}.tar.gz"
if (Get-Command "tar" -ErrorAction SilentlyContinue) {
# Native Windows tar or WSL tar
Push-Location $tempDir
tar -czf "..\$archiveName" *
Pop-Location
} else {
# Fallback: create zip for Linux (not ideal but works)
Write-Warning "tar not found, creating .zip instead of .tar.gz for Linux"
$archiveName = "${BINARY}-${VERSION}-linux-${arch}.zip"
Compress-Archive -Path "$tempDir\*" -DestinationPath "$OUTPUT_DIR\$archiveName" -Force
}
Remove-Item $tempDir -Recurse -Force
Remove-Item "$OUTPUT_DIR\${BINARY}-linux-${arch}"
# Generate SHA256
$hash = Get-FileHash "$OUTPUT_DIR\$archiveName" -Algorithm SHA256 | Select-Object -ExpandProperty Hash
$hash | Out-File "$OUTPUT_DIR\$archiveName.sha256" -Encoding ASCII
Write-Host "Created: $archiveName" -ForegroundColor Yellow
}
Write-Host "`nBuild complete! Artifacts:" -ForegroundColor Green
Get-ChildItem "$OUTPUT_DIR\*" -Include *.zip,*.tar.gz,*.sha256 | ForEach-Object {
Write-Host " - $($_.Name)" -ForegroundColor Yellow
}
Write-Host "`nDone!" -ForegroundColor Green

76
scripts/build-linux.sh Normal file
View File

@@ -0,0 +1,76 @@
#!/bin/bash
# Bash script for building Linux binaries
# Usage: ./scripts/build-linux.sh
set -e # Exit on error
# Read version from VERSION file
VERSION=$(cat VERSION | tr -d '[:space:]')
BINARY="compress"
OUTPUT_DIR="dist"
echo "Building compress $VERSION for Linux..."
# Create output directory if it doesn't exist
mkdir -p "$OUTPUT_DIR"
# Build for Linux amd64
echo ""
echo "Building Linux amd64..."
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o "$OUTPUT_DIR/${BINARY}-linux-amd64" ./cmd
if [ $? -ne 0 ]; then
echo "Failed to build Linux amd64"
exit 1
fi
chmod +x "$OUTPUT_DIR/${BINARY}-linux-amd64"
# Build for Linux arm64
echo "Building Linux arm64..."
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o "$OUTPUT_DIR/${BINARY}-linux-arm64" ./cmd
if [ $? -ne 0 ]; then
echo "Failed to build Linux arm64"
exit 1
fi
chmod +x "$OUTPUT_DIR/${BINARY}-linux-arm64"
echo ""
echo "Packaging Linux releases..."
# Package Linux amd64
echo "Packaging Linux amd64..."
TEMP_DIR="$OUTPUT_DIR/temp-linux-amd64"
mkdir -p "$TEMP_DIR"
cp "$OUTPUT_DIR/${BINARY}-linux-amd64" "$TEMP_DIR/${BINARY}"
[ -f "LICENSE" ] && cp "LICENSE" "$TEMP_DIR/"
[ -f "README.md" ] && cp "README.md" "$TEMP_DIR/"
[ -f "config.yaml.example" ] && cp "config.yaml.example" "$TEMP_DIR/"
tar -czf "$OUTPUT_DIR/${BINARY}-${VERSION}-linux-amd64.tar.gz" -C "$TEMP_DIR" .
rm -rf "$TEMP_DIR"
# Package Linux arm64
echo "Packaging Linux arm64..."
TEMP_DIR="$OUTPUT_DIR/temp-linux-arm64"
mkdir -p "$TEMP_DIR"
cp "$OUTPUT_DIR/${BINARY}-linux-arm64" "$TEMP_DIR/${BINARY}"
[ -f "LICENSE" ] && cp "LICENSE" "$TEMP_DIR/"
[ -f "README.md" ] && cp "README.md" "$TEMP_DIR/"
[ -f "config.yaml.example" ] && cp "config.yaml.example" "$TEMP_DIR/"
tar -czf "$OUTPUT_DIR/${BINARY}-${VERSION}-linux-arm64.tar.gz" -C "$TEMP_DIR" .
rm -rf "$TEMP_DIR"
echo ""
echo "Generating SHA256 checksums..."
# Generate SHA256 checksums
sha256sum "$OUTPUT_DIR/${BINARY}-${VERSION}-linux-amd64.tar.gz" | awk '{print $1}' > "$OUTPUT_DIR/${BINARY}-${VERSION}-linux-amd64.tar.gz.sha256"
sha256sum "$OUTPUT_DIR/${BINARY}-${VERSION}-linux-arm64.tar.gz" | awk '{print $1}' > "$OUTPUT_DIR/${BINARY}-${VERSION}-linux-arm64.tar.gz.sha256"
echo ""
echo "Build complete! Artifacts:"
echo " - $OUTPUT_DIR/${BINARY}-${VERSION}-linux-amd64.tar.gz"
echo " - $OUTPUT_DIR/${BINARY}-${VERSION}-linux-amd64.tar.gz.sha256"
echo " - $OUTPUT_DIR/${BINARY}-${VERSION}-linux-arm64.tar.gz"
echo " - $OUTPUT_DIR/${BINARY}-${VERSION}-linux-arm64.tar.gz.sha256"
echo ""
echo "Done!"

80
scripts/build-windows.ps1 Normal file
View File

@@ -0,0 +1,80 @@
# PowerShell script for building Windows binaries
# Usage: .\scripts\build-windows.ps1
# Exit on error
$ErrorActionPreference = "Stop"
# Read version from VERSION file
$VERSION = Get-Content -Path "VERSION" -Raw
$VERSION = $VERSION.Trim()
$BINARY = "compress"
$OUTPUT_DIR = "dist"
Write-Host "Building compress $VERSION for Windows..." -ForegroundColor Green
# Create output directory if it doesn't exist
if (-Not (Test-Path $OUTPUT_DIR)) {
New-Item -ItemType Directory -Path $OUTPUT_DIR | Out-Null
}
# Build for Windows amd64
Write-Host "`nBuilding Windows amd64..." -ForegroundColor Cyan
$env:CGO_ENABLED = "0"
$env:GOOS = "windows"
$env:GOARCH = "amd64"
go build -ldflags "-s -w" -o "$OUTPUT_DIR\${BINARY}-windows-amd64.exe" .\cmd
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to build Windows amd64"
exit 1
}
# Build for Windows arm64
Write-Host "Building Windows arm64..." -ForegroundColor Cyan
$env:GOOS = "windows"
$env:GOARCH = "arm64"
go build -ldflags "-s -w" -o "$OUTPUT_DIR\${BINARY}-windows-arm64.exe" .\cmd
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to build Windows arm64"
exit 1
}
Write-Host "`nPackaging Windows releases..." -ForegroundColor Green
# Package Windows amd64
Write-Host "Packaging Windows amd64..." -ForegroundColor Cyan
$tempDir = New-Item -ItemType Directory -Path "$OUTPUT_DIR\temp-windows-amd64" -Force
Copy-Item "$OUTPUT_DIR\${BINARY}-windows-amd64.exe" "$tempDir\${BINARY}.exe"
Copy-Item "LICENSE" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "README.md" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "config.yaml.example" "$tempDir\" -ErrorAction SilentlyContinue
Compress-Archive -Path "$tempDir\*" -DestinationPath "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-amd64.zip" -Force
Remove-Item $tempDir -Recurse -Force
# Package Windows arm64
Write-Host "Packaging Windows arm64..." -ForegroundColor Cyan
$tempDir = New-Item -ItemType Directory -Path "$OUTPUT_DIR\temp-windows-arm64" -Force
Copy-Item "$OUTPUT_DIR\${BINARY}-windows-arm64.exe" "$tempDir\${BINARY}.exe"
Copy-Item "LICENSE" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "README.md" "$tempDir\" -ErrorAction SilentlyContinue
Copy-Item "config.yaml.example" "$tempDir\" -ErrorAction SilentlyContinue
Compress-Archive -Path "$tempDir\*" -DestinationPath "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-arm64.zip" -Force
Remove-Item $tempDir -Recurse -Force
Write-Host "`nGenerating SHA256 checksums..." -ForegroundColor Green
# Generate SHA256 checksums
Get-FileHash "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-amd64.zip" -Algorithm SHA256 |
Select-Object -ExpandProperty Hash |
Out-File "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-amd64.zip.sha256" -Encoding ASCII
Get-FileHash "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-arm64.zip" -Algorithm SHA256 |
Select-Object -ExpandProperty Hash |
Out-File "$OUTPUT_DIR\${BINARY}-${VERSION}-windows-arm64.zip.sha256" -Encoding ASCII
Write-Host "`nBuild complete! Artifacts:" -ForegroundColor Green
Write-Host " - $OUTPUT_DIR\${BINARY}-${VERSION}-windows-amd64.zip" -ForegroundColor Yellow
Write-Host " - $OUTPUT_DIR\${BINARY}-${VERSION}-windows-amd64.zip.sha256" -ForegroundColor Yellow
Write-Host " - $OUTPUT_DIR\${BINARY}-${VERSION}-windows-arm64.zip" -ForegroundColor Yellow
Write-Host " - $OUTPUT_DIR\${BINARY}-${VERSION}-windows-arm64.zip.sha256" -ForegroundColor Yellow
Write-Host "`nDone!" -ForegroundColor Green

View File

@@ -1,19 +1,33 @@
# PDF Compressor {{VERSION}}
# Universal File Compress {{VERSION}}
Мощный инструмент для сжатия PDF-файлов с интуитивным текстовым интерфейсом.
Высокопроизводительный инструмент на Go для массового сжатия PDF и изображений (JPEG/PNG) с удобным TUI-интерфейсом, гибкой конфигурацией и модульной архитектурой.
## ✨ Новые возможности
- Рекурсивное сканирование директорий для поиска PDF-файлов
- Улучшенный пользовательский интерфейс с прогресс-индикатором
- Оптимизация производительности при обработке больших файлов
- Атомарная замена файлов с резервным копированием
- Поддержка конфигурационных файлов YAML
## ✨ Ключевые возможности
## 🐛 Исправления и улучшения
- Исправлена обработка файлов с нестандартными именами
- Улучшена стабильность при работе с поврежденными PDF
- Оптимизирован расход памяти при сжатии больших документов
- Исправлены проблемы с кодировкой имен файлов
**Сжатие файлов:**
- 📄 **PDF** — два алгоритма на выбор: PDFCPU (скорость) и UniPDF (качество)
- 🖼️ **Изображения** — JPEG (1050% качество), PNG (адаптивная оптимизация)
- 🔄 **Интеллектуальное сжатие** — автоматический выбор оригинала при неэффективном сжатии
**Производительность и обработка:**
- 🚀 Параллельная обработка с настраиваемым количеством воркеров
- 📁 Рекурсивное сканирование с сохранением структуры папок
- ⚡ Пакетная обработка больших коллекций файлов
- 🔁 Повторы при ошибках (retry) и таймауты
**Интерфейс и управление:**
- 🎨 TUI (Text User Interface) — настройка, запуск и мониторинг прогресса
- ⚙️ YAML конфигурация — гибкое управление параметрами сжатия
- 📊 Детальное логирование в файл и консоль с ротацией
- 🔧 Clean Architecture — расширяемая модульная структура
## 🆕 Что нового в этом релизе
- Реализован выбор между алгоритмами PDFCPU и UniPDF для PDF
- Добавлена поддержка сжатия изображений (JPEG, PNG)
- Улучшен TUI с прогресс-индикатором и статистикой обработки
- Оптимизирована параллельная обработка больших файлов
- Добавлена атомарная замена файлов с резервным копированием
- Расширена конфигурация через YAML-файлы
## 📦 Установка и запуск
@@ -31,43 +45,46 @@
| Платформа | Архитектура | Файл для скачивания |
|-----------|-------------|---------------------|
| **Windows** | x64 | `pdf-compressor-{{VERSION}}-windows-amd64.zip` |
| **Linux** | x64 | `pdf-compressor-{{VERSION}}-linux-amd64.zip` |
| **Linux** | ARM64 | `pdf-compressor-{{VERSION}}-linux-arm64.zip` |
| **macOS** | Intel x64 | `pdf-compressor-{{VERSION}}-darwin-amd64.zip` |
| **macOS** | Apple Silicon | `pdf-compressor-{{VERSION}}-darwin-arm64.zip` |
| **Windows** | x64 (amd64) | `compress-{{VERSION}}-windows-amd64.zip` |
| **Windows** | ARM64 | `compress-{{VERSION}}-windows-arm64.zip` |
| **Linux** | x64 (amd64) | `compress-{{VERSION}}-linux-amd64.tar.gz` |
| **Linux** | ARM64 | `compress-{{VERSION}}-linux-arm64.tar.gz` |
## 🚀 Использование
После установки программу можно запустить несколькими способами:
**Интерактивный режим:**
**Интерактивный режим (TUI):**
```bash
./pdf-compressor
./compress
# Windows: .\compress.exe
```
**Пакетная обработка:**
**Пакетная обработка директории:**
```bash
./pdf-compressor -input /path/to/pdfs -output /path/to/compressed
./compress --input /path/to/files --output /path/to/compressed --config config.yaml
```
**Обработка одного файла:**
**Обработка с выбором алгоритма:**
```bash
./pdf-compressor -file document.pdf
# PDF через PDFCPU (быстрее)
./compress --input ./pdfs --algorithm pdfcpu
# PDF через UniPDF (выше качество)
./compress --input ./pdfs --algorithm unipdf
```
**Сжатие изображений:**
```bash
./compress --input ./images --output ./compressed --format jpeg --quality 85
```
## 📖 Документация
- **README.md** - основная документация
- **config.yaml.example** - пример конфигурационного файла
- **RELEASE_GUIDE.md** - руководство по релизам
## 🆘 Поддержка
Если у вас возникли вопросы или проблемы:
1. Проверьте документацию в репозитории
2. Создайте Issue с описанием проблемы
3. Приложите лог-файлы для диагностики
- **README.md** — полное руководство по использованию и конфигурации
- **config.yaml.example** пример конфигурационного файла с комментариями
- Документация по архитектуре — описание Clean Architecture подхода
- Примеры использования — различные сценарии обработки файлов
---
**Благодарим за использование PDF Compressor!** 🙏
**Благодарим за использование Compress!** 🙏