Мы работаем над несколькими проектами ASP.NET MVC C# в Visual Studio 2015 и Team Foundation Server 2013. Иногда процесс обновления NuGet приводит к беспорядку, и некоторые замененные файлы (в основном *.png, *.gif, *.ttf) не был зарегистрирован должным образом. Что мы выяснили на данный момент: процесс регистрации сталкивается с проблемами, если каталоги должны быть удалены и созданы за один шаг. Вы должны зарегистрироваться дважды. Проблема в том, что если вы не знаете об этом, и один из наших разработчиков извлекает последний исходный код, в нем отсутствуют файлы. Visual Studio указывает на это значком предупреждения в обозревателе решений.
Мой вопрос: можно ли проверить, присутствует ли каждый файл во время закрытой регистрации или ночной сборки в TFS, ссылка на который содержится в файле csproj? По крайней мере, должно быть предупреждение во время сборки.
Подсказка: это проблема только с файлами, которые не скомпилированы (файлы *.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, изменил определение сборки, добавил каталог сценария в свои «Исходные настройки» и включил сценарий в «Путь к сценарию предварительной сборки». Сделанный!