1
votes

We have a solution in TFS 2012 that contains several projects. I have set up a Continuous Integration build on our build server and have set Clean Workspace = None. I'm using the TFS Versioning template 2.0 to update the AssemblyFileVersion and AssemblyVersions.

When the build is run, each project has its AssemblyInfo.cs file updated with a new version number even though there have been no changes made to the code in some of the projects. Ideally we want the version to change only if there have been changes to the project.

I was considering building each project separately, but we would prefer to be able to simply build the solution. I have read that Clean Workspace = None should prevent the projects from being updated but it doesn't appear to be happening for me since the timestamp on all the dll's are showing as changed after the build.

I am new to setting up a build process, so I'm hoping there is something simple that I'm doing wrong. Any suggestions would be greatly appreciated.

Update: After checking the suggested link, it appears that I'm doing two things during build that may be causing the issue: 1) web.config file transforms that take place in an "AfterBuild" step in one of my projects and 2) using the version number increment features in the "TFS Versioning" template without opening up the workflow to see how it is checking for changed files. I'll remove both of these and see what happens.

1
I am not sure if you can achieve this with the built in stuff, but we wrote a custom build activity to do this for us. In short, it loops through all the Gets, Replaces and Deletes that are populated when it performs a get latest on an incremental build. At this point it knows all the files that have changed. It then has a config file that tells it about the projects and essentially it checks to see whether each project has a changed file. If it does, it goes in and bumps the version number. I hope this sets you on the right path.gregpakes

1 Answers

0
votes

This is a good question and it is possible. I run powershell scripts that use the TFS API to determine what files have changed

You need to get the changesets and shelvesets also, but once you have these you can get the information you want like this:

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;

}