پاورشل برای برنامهنویسان
@programming_tipsدرسنامه: نوشتن اسکریپت برای Build Automation
این درسنامه دربارهی نحوهی استفاده از PowerShell برای خودکارسازی فرآیند Build (ساخت پروژه) است. منظور از Build Automation اجرای مراحلی مثل کامپایل، تست، فشردهسازی، انتقال فایلها یا حتی Deployment بدون دخالت دستی است. این کار باعث صرفهجویی در زمان، کاهش خطا و افزایش سرعت توسعه میشود.
۱. مفهوم Build Automation
در پروژههای نرمافزاری، مخصوصاً در محیطهای بزرگتر، نیاز است که مراحل تکراری مثل ساخت (build)، تست، بستهبندی و انتشار (deploy) بهصورت خودکار انجام شوند.
پاورشل ابزاری عالی برای این کار است، چون هم به سیستمعامل و فایلها دسترسی دارد، هم میتواند سایر ابزارها را اجرا و با آنها تعامل کند.
۲. ساخت اسکریپت PowerShell برای Build
یک اسکریپت Build معمولاً شامل چند مرحلهی متوالی است. مثلاً:
- پاک کردن پوشههای قدیمی (Clean)
- کامپایل سورسکد
- اجرای تستها
- فشردهسازی خروجی
- انتقال خروجی به پوشهی نهایی یا سرور
در PowerShell میتوان این مراحل را بهترتیب در یک فایل .ps1 نوشت.
نمونهی ساده:
# build.ps1
Write-Host "Starting build process..."
# 1. پاک کردن خروجی قبلی
if (Test-Path "dist") {
Remove-Item "dist" -Recurse -Force
Write-Host "Old build deleted."
}
# 2. ساخت پوشه جدید
New-Item -ItemType Directory -Path "dist" | Out-Null
Write-Host "Output directory created."
# 3. کامپایل پروژه (فرض کنید با npm build)
Write-Host "Building project..."
npm run build
# 4. انتقال فایلها به dist
Copy-Item ".\build\*" ".\dist" -Recurse
Write-Host "Files copied to dist folder."
Write-Host "Build completed successfully!"
۳. اجرای ابزارهای خارجی در PowerShell
پاورشل میتواند ابزارهای خارجی مثل npm، dotnet، gcc، msbuild، python یا docker را مستقیماً اجرا کند.
بهعنوان مثال، برای پروژههای .NET:
dotnet clean dotnet build -c Release dotnet test
یا برای پروژههای Node.js:
npm install npm run build
میتوان همهی این مراحل را در یک اسکریپت PowerShell ترکیب کرد و فقط با اجرای یک فایل build.ps1 همهی کارها را انجام داد.
۴. متغیرها و مسیرهای داینامیک
در اسکریپتهای Build بهتر است از متغیرها برای مسیرها یا تنظیمات استفاده شود تا اسکریپت قابلانعطافتر باشد:
$SourceDir = "src"
$BuildDir = "build"
$DistDir = "dist"
if (Test-Path $BuildDir) { Remove-Item $BuildDir -Recurse -Force }
New-Item -ItemType Directory -Path $DistDir | Out-Null
Copy-Item "$SourceDir\*" "$BuildDir" -Recurse
۵. مدیریت خطاها در فرآیند Build
اگر یکی از مراحل Build شکست بخورد، بهتر است اسکریپت متوقف شود یا خطا را ثبت کند. PowerShell این کار را با try/catch و $LASTEXITCODE انجام میدهد:
try {
npm run build
if ($LASTEXITCODE -ne 0) { throw "Build failed." }
} catch {
Write-Host "Error during build: $($_.Exception.Message)"
exit 1
}
۶. اضافه کردن پارامتر به اسکریپت
گاهی لازم است که اسکریپت بر اساس ورودی کاربر اجرا شود (مثلاً انتخاب محیط build یا نوع خروجی).
param(
[string]$Configuration = "Release",
[string]$OutputDir = "dist"
)
Write-Host "Building in $Configuration mode..."
dotnet build -c $Configuration
Copy-Item ".\bin\$Configuration\net8.0\*" $OutputDir -Recurse
با این کار میتوان اسکریپت را اینطور اجرا کرد:
.\build.ps1 -Configuration Debug
۷. ترکیب Build با نسخهگذاری و Deployment
پاورشل میتواند مراحل پیشرفتهتری مانند تولید نسخهی جدید یا انتقال خروجی به سرور را نیز انجام دهد:
$version = Get-Date -Format "yyyy.MM.dd.HHmm" Write-Host "Packaging version $version..." Compress-Archive -Path ".\dist\*" -DestinationPath ".\release\app-$version.zip" Write-Host "Package created: app-$version.zip" # انتقال فایل به سرور (مثلاً با SCP) # scp ".\release\app-$version.zip" user@server:/var/www/app/
۸. زمانبندی و اجرای خودکار Build
با استفاده از Task Scheduler در ویندوز، میتوان این اسکریپت را بهصورت زمانبندیشده اجرا کرد (مثلاً هر شب ساعت ۲ بامداد).
یا میتوان آن را در CI/CD مثل GitHub Actions یا Jenkins ادغام کرد تا بعد از هر commit اجرا شود.
جمعبندی
- پاورشل میتواند تمام مراحل Build یک پروژه را خودکار کند.
- با استفاده از دستورات سیستمی، اجرای ابزارهای خارجی، و مدیریت خطاها میتوان یک فرآیند ساخت حرفهای ساخت.
- استفاده از متغیرها، پارامترها و ساختارهای کنترلی باعث انعطاف و قابلاستفاده بودن اسکریپت در پروژههای مختلف میشود.
- این نوع اسکریپتها پایهی اتوماسیون در DevOps و CI/CD هستند.
با یادگیری این مبحث، میتوانید برای هر نوع پروژه (از Node و Python تا C# و Docker) یک فرآیند Build خودکار و حرفهای بسازی.