我们正在 Visual Studio 2015 和 Team Foundation Server 2013 中处理多个 ASP.NET MVC C# 项目。有时 NuGet 升级过程是一团糟,一些被替换的文件(主要是 *.png、*.gif、*.ttf)有未正确办理登机手续。到目前为止,我们发现:如果目录应该在一个步骤中删除和创建,签入过程就会遇到麻烦。您必须登记两次。问题是,如果您对此一无所知,并且我们的一位开发人员检索了最新的源代码,那么就会缺少文件。Visual Studio 在解决方案资源管理器中显示警告图标。
我的问题是:是否可以验证是否每个文件都存在于 csproj 文件中链接的 TFS 上的门控签入或夜间构建期间?至少在构建过程中应该有一个警告。
提示:这只是未编译的文件(*.cs 文件)或没有设置“在构建期间复制到输出目录”的问题。例如,捆绑在一起的 JS 文件会发生这种情况。
最终解决方案:
Write-Host "Check availability for all referenced files in all projects ..."
function Check-Files($directory, $files){
if (!$directory.EndsWith("/")) { $directory = "$($directory)/" }
ForEach($file in $files){
if($file){
Write-Host " Referenced file $($directory)$file"
if(-not (Test-Path "$($directory)$($file)")){
throw [System.IO.FileNotFoundException] "$($directory)$($file) not found."
}
}
}
}
function CheckProjectFile($csprojFile){
[xml]$projectContent = Get-Content $csprojFile
Write-Host "Checking project: $($csprojFile) ..."
$directory = Split-Path $csprojFile
ForEach($itemGroup in $projectContent.Project.ItemGroup){
Check-Files -files $itemGroup.Reference.HintPath -dir $directory
Check-Files -files $itemGroup.Compile.Include -dir $directory
Check-Files -files $itemGroup.None.Include -dir $directory
Check-Files -files $itemGroup.Content.Include -dir $directory
Check-Files -files $itemGroup.TypeScriptCompile.Include -dir $directory
Check-Files -files $itemGroup.ProjectReference.Include -dir $directory
}
}
$csprojFiles = Get-ChildItem -Path ./ -Recurse *.csproj | Select-Object -Property FullName
ForEach($file in $csprojFiles){
CheckProjectFile($file.FullName)
}
我将脚本文件添加到 TFS 上的团队项目中,更改了构建定义,将脚本目录添加到了“源设置”中,并将脚本包含到了“预构建脚本路径”中。完毕!