在软件开发过程中,自动化构建脚本是提高开发效率的重要工具。本文将介绍如何使用PowerShell和MSBuild制作一个自动化构建脚本,并提供一些优化建议。
在紧迫的项目截止日期下,需要在一小时内完成构建脚本的编写。PowerShell脚本能够满足需求,并且运行良好。
构建步骤如下:
为了确保构建过程中没有其他Visual Studio实例干扰,脚本开始时会请求关闭所有DevEnv实例。
Write-Host "请确保在运行脚本前没有运行任何Visual Studio实例..." -ForegroundColor Red -BackgroundColor White
Start-Sleep -s 10
构建初始化和配置如下:
$baseDirectory = "D:\Project1\Source"
$solutionFilesPath = "$baseDirectory\SolutionConfig.txt"
$projectFiles = Get-Content $solutionFilesPath
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"
$MSBuildLogger = "/flp1:Append;LogFile=Build.log;Verbosity=Normal; /flp2:LogFile=BuildErrors.log;Verbosity=Normal;errorsonly"
$devenv = "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe"
检查文件是否存在,并且文件扩展名为.sln。如果需要包括其他文件,如.csproj、vcxproj等,可以在脚本中进行相应的修改。
foreach ($projectFile in $projectFiles) {
if ($projectFile.EndsWith(".sln")) {
$projectFileAbsPath = "$baseDirectory\$projectFile"
$filename = [System.IO.Path]::GetFileName($projectFile);
while ($action -eq "Y") {
if (Test-Path $projectFileAbsPath) {
Write-Host "正在构建 $projectFileAbsPath"
& $msbuild $projectFileAbsPath /t:rebuild /p:PlatformTarget=x86 /fl "$MSBuildLogger"
if ($LASTEXITCODE -eq 0) {
Write-Host "构建成功" -ForegroundColor Green
Clear-Host
break
} else {
Write-Host "构建失败" -ForegroundColor Red
$action = Read-Host "输入Y修复后继续,N终止,I忽略并继续构建"
if ($action -eq "Y") {
& $devenv $projectFileAbsPath
wait-process -name devenv
} elseif ($action -eq "I") {
Write-Host "忽略构建失败..."
break
} else {
Write-Host "终止构建...请修复问题后重新启动构建。" -ForegroundColor Red
break
}
}
} else {
Write-Host "文件不存在:$projectFileAbsPath"
Start-Sleep -s 5
break
}
}
if ($action -eq "N") {
break;
}
}
}
MSBuild是一个构建应用程序的平台。使用MSBuild,可以在没有安装Visual Studio的系统上构建项目。
# MSBuild相关命令
要修复构建错误,需要在安装了Visual Studio的机器上运行此脚本。脚本将启动Visual Studio并打开失败的解决方案。解决所有错误后,关闭Visual Studio以继续构建下一个解决方案。
# 修复构建错误的相关命令
如果所有项目都成功编译,构建将成功完成。如果选择不修复错误,构建将因错误而终止。
MSBuild提供了非常全面的日志记录机制。以下脚本创建了两个日志文件,一个用于记录成功的构建,另一个用于记录错误。
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"
$MSBuildLogger = "/flp1:Append;LogFile=Build.log;Verbosity=Normal; /flp2:LogFile=BuildErrors.log;Verbosity=Normal;errorsonly"
& $msbuild $projectFileAbsPath /t:rebuild /p:PlatformTarget=x86 /fl "$MSBuildLogger"
在PowerShell中等待进程退出,可以通过进程名称来等待,也可以使用进程ID。
Wait-Process -name devenv
# 或者
Start-Process $devenv -NoNewWindow -Wait
# 或者
$proc = Start-Process -NoWindow
$proc.WaitForExit()
要检查目录或文件是否存在,可以使用Test-Path命令。Test-Path也可以用于验证WindowsPowerShell注册表提供程序中的注册表项是否存在。
if (Test-Path $projectFileAbsPath) {
# 文件或目录存在
} else {
# 文件或目录不存在
}
& svn co $repositoryUrl1 $repositoryUrl2 $destinationDir
# 标记源代码
# Windows SDK工具路径