.net 如果视图发生更改,请使用TeamCity启用MvcBuildViews

.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建

场景

我们让TeamCity 8.1.3构建每个拉动请求。GitHub中报告了构建失败。这太棒了。但是,不会拾取视图错误。这很糟糕。我可以全面地打开MvcBuildViews,但我不希望这样,因为我们的解决方案非常大,而且编译时间大约增加了三倍

我想做的是,仅当在PR中的提交中更改了视图时才启用MvcBuildViews。例如,如果有人更改了.cs文件,则按正常方式编译。如果.cshtml文件已更改,请启用MvcBuildViews并编译

我尝试过的

我的第一次尝试使用了。我在TeamCity建立了两个几乎相同的项目。唯一不同的是VCS触发器。一个构建用于构建代码更改,另一个构建用于构建视图更改

代码更改触发规则:-:\**.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
不太重要的是,当使用这个时,我注意到TeamCity认为构建是随着时间的推移而进行的。我不确定能不能对此做点什么

$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日

我已经编写了这个脚本的高级版本