TFS:如何验证每个文件是否已签入?
TFS: How to validate if every file is checked-in?
我们正在 Visual Studio 2015 年和 Team Foundation Server 2013 中处理几个 ASP.NET MVC C# 项目。有时 NuGet 升级过程一团糟,一些替换文件(主要是 *.png , *.gif, *.ttf) 未正确签入。
到目前为止我们发现的是:如果目录应该在一个步骤中删除和创建,则签入过程会遇到麻烦。你必须登记两次。问题是,如果您不知道这一点并且我们的一位开发人员检索了最新的源代码,那么就会有丢失的文件。 Visual Studio 表示在解决方案资源管理器中带有警告图标。
我的问题是:是否可以验证在 csproj 文件中链接的 TFS 上的 gated-checkin 或 nightly-build 期间是否存在每个文件?至少应该在构建过程中有一个警告。
提示:这只是文件的问题,这些文件没有编译(*.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 上的团队项目中,更改了构建定义,将脚本目录添加到我的 "Source Settings" 并将脚本包含到 "Pre-build script path" 中。完成!
首先,确保每次都solution/project签到。这样,此解决方案/项目中的所有编辑文件都将列在 Included pending changes 中。如果您只签入一个文件,则其他编辑将列在排除的更改中并且不会被签入。
您还可以使用签入政策来防止未经审查就签入。以下是要求在签入前进行代码审查的现有签入政策:
https://visualstudiogallery.msdn.microsoft.com/c476b708-77a8-4065-b9d0-919ab688f078
我创建了一小段 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
}
希望对您有所帮助。
亲切的问候
一月
我们正在 Visual Studio 2015 年和 Team Foundation Server 2013 中处理几个 ASP.NET MVC C# 项目。有时 NuGet 升级过程一团糟,一些替换文件(主要是 *.png , *.gif, *.ttf) 未正确签入。 到目前为止我们发现的是:如果目录应该在一个步骤中删除和创建,则签入过程会遇到麻烦。你必须登记两次。问题是,如果您不知道这一点并且我们的一位开发人员检索了最新的源代码,那么就会有丢失的文件。 Visual Studio 表示在解决方案资源管理器中带有警告图标。
我的问题是:是否可以验证在 csproj 文件中链接的 TFS 上的 gated-checkin 或 nightly-build 期间是否存在每个文件?至少应该在构建过程中有一个警告。
提示:这只是文件的问题,这些文件没有编译(*.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 上的团队项目中,更改了构建定义,将脚本目录添加到我的 "Source Settings" 并将脚本包含到 "Pre-build script path" 中。完成!
首先,确保每次都solution/project签到。这样,此解决方案/项目中的所有编辑文件都将列在 Included pending changes 中。如果您只签入一个文件,则其他编辑将列在排除的更改中并且不会被签入。
您还可以使用签入政策来防止未经审查就签入。以下是要求在签入前进行代码审查的现有签入政策:
https://visualstudiogallery.msdn.microsoft.com/c476b708-77a8-4065-b9d0-919ab688f078
我创建了一小段 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
}
希望对您有所帮助。 亲切的问候 一月