【问题标题】:Incremental build in TFS - How do I update AssemblyInfo.cs version only for projects that have changed?TFS 中的增量构建 - 如何仅为已更改的项目更新 AssemblyInfo.cs 版本?
【发布时间】:2013-08-11 22:59:01
【问题描述】:

我们在 TFS 2012 中有一个包含多个项目的解决方案。我已经在我们的构建服务器上设置了一个持续集成构建,并设置了 Clean Workspace = None。我正在使用 TFS 版本控制模板 2.0 来更新 AssemblyFileVersion 和 AssemblyVersions。

运行构建时,每个项目的 AssemblyInfo.cs 文件都会更新为新版本号,即使某些项目中的代码没有更改。理想情况下,我们希望仅在项目发生更改时更改版本。

我曾考虑单独构建每个项目,但我们希望能够简单地构建解决方案。我已经读过 Clean Workspace = None 应该阻止项目被更新,但它似乎并没有发生在我身上,因为所有 dll 上的时间戳在构建后都显示为更改。

我是设置构建过程的新手,所以我希望我做错了一些简单的事情。任何建议将不胜感激。

更新: 检查建议的链接后,似乎我在构建过程中做了两件事可能会导致问题:1)在我的一个项目的“AfterBuild”步骤中发生的 web.config 文件转换和 2)使用“TFS 版本控制”模板中的版本号增量功能,而无需打开工作流以查看它如何检查更改的文件。我会删除这两个,看看会发生什么。

【问题讨论】:

  • 我不确定你是否可以使用内置的东西来实现这一点,但我们编写了一个自定义构建活动来为我们做到这一点。简而言之,它循环遍历在增量构建上执行获取最新时填充的所有GetsReplacesDeletes。此时它知道所有已更改的文件。然后它有一个配置文件,告诉它有关项目的信息,本质上它检查每个项目是否有更改的文件。如果是这样,它会进入并增加版本号。我希望这能让你走上正确的道路。

标签: build tfs versioning tfsbuild


【解决方案1】:

这是一个很好的问题,而且是可能的。我运行使用 TFS API 的 powershell 脚本来确定哪些文件已更改

您还需要获取变更集和搁置集,但是一旦拥有这些,您就可以像这样获取所需的信息:

function Get-ChangesetChanges()
{
    [CmdletBinding()]
    param ([Parameter(Mandatory=$true)][string]$Changeset,[Parameter(Mandatory=$true)][string]$TFSServer)
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.VersionControl.Client')
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Client')
$tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($TFSServer) 
$vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])  
$vcsChanges = $vcs.GetChangeset($changeset).Changes;
$changes = @();

foreach ($change in $vcsChanges)
{   
    $changes += $change.Item.ServerItem;
}

$changes;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2016-02-10
    • 2017-03-15
    • 1970-01-01
    • 2016-05-01
    • 2019-01-11
    相关资源
    最近更新 更多