Добавлены скрипты сборки для кроссплатформенных двоичных файлов и лицензия 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:
117
scripts/build-all.ps1
Normal file
117
scripts/build-all.ps1
Normal 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
76
scripts/build-linux.sh
Normal 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
80
scripts/build-windows.ps1
Normal 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
|
||||
@@ -1,19 +1,33 @@
|
||||
# PDF Compressor {{VERSION}}
|
||||
# Universal File Compress {{VERSION}}
|
||||
|
||||
Мощный инструмент для сжатия PDF-файлов с интуитивным текстовым интерфейсом.
|
||||
Высокопроизводительный инструмент на Go для массового сжатия PDF и изображений (JPEG/PNG) с удобным TUI-интерфейсом, гибкой конфигурацией и модульной архитектурой.
|
||||
|
||||
## ✨ Новые возможности
|
||||
- Рекурсивное сканирование директорий для поиска PDF-файлов
|
||||
- Улучшенный пользовательский интерфейс с прогресс-индикатором
|
||||
- Оптимизация производительности при обработке больших файлов
|
||||
- Атомарная замена файлов с резервным копированием
|
||||
- Поддержка конфигурационных файлов YAML
|
||||
## ✨ Ключевые возможности
|
||||
|
||||
## 🐛 Исправления и улучшения
|
||||
- Исправлена обработка файлов с нестандартными именами
|
||||
- Улучшена стабильность при работе с поврежденными PDF
|
||||
- Оптимизирован расход памяти при сжатии больших документов
|
||||
- Исправлены проблемы с кодировкой имен файлов
|
||||
**Сжатие файлов:**
|
||||
- 📄 **PDF** — два алгоритма на выбор: PDFCPU (скорость) и UniPDF (качество)
|
||||
- 🖼️ **Изображения** — JPEG (10–50% качество), 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!** 🙏
|
||||
|
||||
Reference in New Issue
Block a user