.net 如果视图发生更改,请使用TeamCity启用MvcBuildViews
场景 我们让TeamCity 8.1.3构建每个拉动请求。GitHub中报告了构建失败。这太棒了。但是,不会拾取视图错误。这很糟糕。我可以全面地打开MvcBuildViews,但我不希望这样,因为我们的解决方案非常大,而且编译时间大约增加了三倍 我想做的是,仅当在PR中的提交中更改了视图时才启用MvcBuildViews。例如,如果有人更改了.cs文件,则按正常方式编译。如果.cshtml文件已更改,请启用MvcBuildViews并编译 我尝试过的 我的第一次尝试使用了。我在TeamCity建立了两个几乎相同的项目。唯一不同的是VCS触发器。一个构建用于构建代码更改,另一个构建用于构建视图更改 代码更改触发规则:.net 如果视图发生更改,请使用TeamCity启用MvcBuildViews,.net,asp.net-mvc,asp.net-mvc-4,powershell,teamcity,.net,Asp.net Mvc,Asp.net Mvc 4,Powershell,Teamcity,场景 我们让TeamCity 8.1.3构建每个拉动请求。GitHub中报告了构建失败。这太棒了。但是,不会拾取视图错误。这很糟糕。我可以全面地打开MvcBuildViews,但我不希望这样,因为我们的解决方案非常大,而且编译时间大约增加了三倍 我想做的是,仅当在PR中的提交中更改了视图时才启用MvcBuildViews。例如,如果有人更改了.cs文件,则按正常方式编译。如果.cshtml文件已更改,请启用MvcBuildViews并编译 我尝试过的 我的第一次尝试使用了。我在TeamCity建
-:\**.cshtml
和+:**.cs
查看更改触发规则:+:**.cshtml
这并不像我希望的那样奏效。在同一分支上提交.cs文件和.cshtml文件将触发这两个版本
我的第二次尝试是使用PowerShell构建步骤。我想知道是否可以使用PowerShell读取代理构建属性,确定cshtml文件是否已更改,如果已更改,请将MvcBuildViews设置为true
这失败了,因为我无法找到读取代理属性的方法。我找到了这个,但没用
我的PS构建步骤如下所示。我主要是在抓救命稻草
write-host "##teamcity[message text='Starting PhilTest build step']"
write-host "##teamcity[message text='Build number $env:build_number']" #Outputs build number
write-host "##teamcity[message text='Changed files $env:teamcity_build_changedFiles_file']" #Outputs nothing
foreach ($row in $env:teamcity_build_changedFiles_file)
{
write-host "##teamcity[message text='Changed files row $row']" #Outputs nothing
}
write-host "##teamcity[message text='Ending PhilTest build step']"
下一步是什么?
以前有人这样做过吗?是否有人知道我如何获得以前的一次工作尝试,或者知道其他方法?teamcity.build.changedFiles.file没有环境变量,您可以在此文档上看到: 在这种情况下,您可以使用%system.teamcity.build.changedFiles.file%。TeamCity将向您的PowerShell脚本传递文件的完整路径,其中包含有关生成中包含的已更改文件的信息 该文件包含新行分隔文件:每行对应一个文件,格式如下:
<relative file path>:<change type>:<revision>
::
以giacomelli的答案为起点,我创建了这个TeamCity PowerShell构建步骤,它正是我想要的。它读取已更改的文件列表,确定视图是否已更改,如果已更改,则在所有csproj文件中将MvcBuildViews设置为true。请注意:
- 我不是TeamCity或PowerShell专家,你可能会想整理一下
- 您不太可能希望在所有csproj文件上设置MvcBuildViews
$changedFileInfoPath = '%system.teamcity.build.changedFiles.file%'
$fileData = Get-Content $changedFileInfoPath
$containsViews = $false
foreach($line in $fileData)
{
write-host "##teamcity[message text='File contents = $line']"
if($line -like "*.cshtml*")
{
$containsViews = $true
break
}
}
if ($containsViews)
{
write-host "##teamcity[message text='View changes found']"
function xmlPoke($file, $xpath, $value)
{
$filePath = $file.FullName
[xml] $fileXml = Get-Content $filePath
$node = $fileXml.SelectSingleNode($xpath)
if ($node)
{
$node.InnerText = $value
$fileXml.Save($filePath)
}
}
$workingDirectory = '%teamcity.build.workingDir%'
$webCsProjFiles = Get-ChildItem -Path $workingDirectory -Recurse -Include "*.csproj"
foreach ($csProjFile in $webCsProjFiles)
{
xmlPoke $csProjFile "//*[local-name()='MvcBuildViews']" "true"
write-host "##teamcity[message text='Set MvcBuildViews true in $csProjFile']"
}
}
else
{
write-host "##teamcity[message text='No view changes were found']"
}
更新日期2014年10月22日
我已经编写了这个脚本的高级版本