TFS: как проверить, зарегистрирован ли каждый файл?

Мы работаем над несколькими проектами 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, изменил определение сборки, добавил каталог сценария в свои «Исходные настройки» и включил сценарий в «Путь к сценарию предварительной сборки». Сделанный!


person SiMiDev    schedule 24.08.2016    source источник
comment
Вы имеете в виду, что обновление Nuget заменит ваши файлы изображений? Эти файлы изображений восстанавливаются Nuget? Вы проверяете все решение или отдельный файл?   -  person Cece Dong - MSFT    schedule 25.08.2016
comment
Материал NuGet был просто примером по причине этой проблемы. Вопросы в пункте «Мой вопрос…» ;-)   -  person SiMiDev    schedule 29.08.2016


Ответы (2)


Я создал небольшую часть PowerShell, которую вы можете выполнить в качестве шага перед созданием решения.

function Check-Files($files){
  ForEach($file in  $files){
    if($file){
      Write-Host "looking for $file"
      if(-not (Test-Path $file)){
        throw [System.IO.FileNotFoundException] "$file not found."
      }
    }
  }
}

[xml]$projectContent = Get-Content ./your.csproj
ForEach($itemGroup in $projectContent.Project.ItemGroup){
  Check-Files -files $itemGroup.Reference.HintPath
  Check-Files -files $itemGroup.Compile.Include
  Check-Files -files $itemGroup.None.Include
  Check-Files -files $itemGroup.Content.Include
  Check-Files -files $itemGroup.TypeScriptCompile.Include
  Check-Files -files $itemGroup.ProjectReference.Include
}

Надеюсь, это поможет вам. С уважением Ян

person Jan Schweda    schedule 05.09.2016
comment
Привет @Ян. Это был правильный путь. Я немного адаптировал ваш шаблон скрипта. Теперь он автоматически сканирует файлы *.csproj. Затем каждый файл проверяется на наличие отсутствующих файлов. Это прекрасно работает. Большое спасибо! Я обновлю свой вопрос новым файлом сценария. - person SiMiDev; 08.09.2016

Прежде всего, убедитесь, что вы каждый раз проверяете все решение/проект. Таким образом, все файлы редактирования в этом решении/проекте будут перечислены в списке включенных ожидающих изменений. Если вы возвращаете только один файл, другие изменения будут перечислены в списке исключенных изменений и не будут возвращены.

Также вы можете использовать политику регистрации, чтобы предотвратить регистрацию без проверки. Вот существующая политика регистрации, которая требует проверки кода перед регистрацией:

https://visualstudiogallery.msdn.microsoft.com/c476b708-77a8-4065-b9d0-919ab688f078

person Cece Dong - MSFT    schedule 25.08.2016
comment
Это был не мой вопрос?! Я знаю, как зарегистрироваться. Я знаю правила регистрации. Я просто хочу знать, может ли контроллер сборки проверить, есть ли на борту каждый файл, упомянутый в csproj-файлах... - person SiMiDev; 29.08.2016
comment
Контроллер сборки выполняет некоторые легкие задачи, такие как определение имени сборки, создание метки в системе управления версиями, ведение журнала примечаний и отчет о состоянии сборки. Он не может проверить, зарегистрированы ли все ваши файлы. Вам нужно либо зарегистрировать все решение/проект, либо использовать политику регистрации, чтобы убедиться, что все файлы зарегистрированы. - person Cece Dong - MSFT; 30.08.2016
comment
Вот так. Контроллер сборки или его агент выполняет только основные задачи. MSBuild выполняет задание, и MSBuild обнаруживает отсутствующие файлы (файлы C# или файлы с настроенным местом назначения в выходной папке). К сожалению, MSBuild не проверяет другие файлы, которые не нужно компилировать или копировать. Мы думаем, что невозможно использовать «Политику регистрации» для решения нашей проблемы… Прошу прощения, но, возможно, мой английский недостаточно хорош, чтобы указать на нашу первоначальную проблему. - person SiMiDev; 05.09.2016