2016-08-24 57 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

相關問題