2016-08-24 68 views
0

我们正在研究Visual Studio 2015和Team Foundation Server 2013中的几个ASP.NET MVC C#项目。有时NuGet升级过程是一团糟,一些被替换的文件(主要是* .png,* .gif,* .ttf )没有正确登记。 到目前为止我们已经发现:如果目录应该一步删除并创建,则签入过程会陷入困境。你必须登记两次。问题是,如果您不知道这一点,并且我们的开发人员检索最新的源代码,则会丢失文件。 Visual Studio通过解决方案资源管理器中的警告图标指示。TFS:如何验证每个文件是否签入?

我的问题是:是否有可能验证,如果每个文件都存在于gated-checkin期间或每晚在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,改变了我的生成定义,添加脚本目录以我的“源设置”,包括剧本到“预“生成脚本路径”。完成!

+0

你的意思是Nuget升级会替换你的图片文件吗?这些图像文件是否由Nuget恢复?你是否检查整个解决方案或单个文件? –

+0

NuGet的东西只是这个问题的一个例子。问题在于“我的问题是......”;-) – SiMiDev

回答

1

我创建了一个小片的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 
} 

希望这可以帮助你。 亲切的问候 Jan

+0

Hi @Jan。这是正确的轨道。我改编了一下你的脚本模板。现在它会自动扫描* .csproj文件。然后检查每个文件的丢失文件。它效果很好。非常感谢!我将用新的脚本文件更新我的问题。 – SiMiDev

0

首先,确保您每次都检查整个解决方案/项目。通过这种方式,此解决方案/项目中的所有编辑文件将列入“包含的待处理更改”中。如果您只检查单个文件,则其他编辑将列入排除的更改中,并且不会被签入。

此外,您还可以使用签入策略来防止未经审阅即签入。下面是一个现有签入策略,需要的代码审查之前办理入住手续:

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

+0

那不是我的问题?!我知道如何办理登机手续,我知道办理登机手续的政策。我只想知道,如果构建控制器可以检查,如果csproj-files中提到的每个文件都在板上... – SiMiDev

+0

构建控制器执行一些轻量级任务,例如确定构建的名称,创建标记版本控制,日志记录和来自构建的报告状态。它无法验证您的所有文件是否已签入。您需要检入整个解决方案/项目或使用签入策略来确保所有文件都已签入。 –

+0

没错。构建控制器或其代理仅执行基本任务。 MSBuild执行该任务,MSBuild检测丢失的文件(C#文件或输出文件夹中具有已配置目标的文件)。不幸的是,MSBuild不检查其他文件,这些文件不需要编译或复制。我们认为使用“签入政策”来解决我们的问题是不可能的......我很抱歉,但也许我的英语不够好,不足以指出我们最初的问题。 – SiMiDev

相关问题