2011-10-04 30 views
4

是否有任何方式獲得程序集版本號,就像我們以前用Team Builder 2010 Workflow使用Msbuild一樣?以下是我們如何用%(Info.Version)獲得裝配版本的簡單示例。如何在Team Build 2010工作流程中獲取程序集版本

<Target Name="CheckFileVersion" DependsOnTargets="AfterDrop"> 
    <ItemGroup> 
     <MyAssemblies Include='$(DropLocation)\$(BuildNumber)\Release\MyApp.exe' /> 
    </ItemGroup> 
    <GetAssemblyIdentity AssemblyFiles="@(MyAssemblies)"> 
     <Output TaskParameter="Assemblies" ItemName="Info"/> 
    </GetAssemblyIdentity> 
    </Target> 

我已經找到了一些方法來創建具有多行代碼的自定義活動,但我認爲必須有做一個簡單的方法。

回答

3

GoRoS有正確的想法,但它只在第一次正常工作。

爲了避免這個問題,您必須運行此代碼或來自Build Agent的不同AppDomain中的類似代碼,Powershell和InvokeProcessActivity可以解決我們的問題。

GetAssemblyVersionNumber.ps1:

$error.clear() 

if ($args.length -ne 1) 
{ 
    Write-Error "Usage: GetAssemblyVersionNumber.ps1 <Assembly>" 
    exit 1 
} 

# Now load the assembly 
$assembly = [System.Reflection.Assembly]::Loadfile($args[0]) 

# Get name, version and display the results 
$name = $assembly.GetName() 
Write-Host $name.version 

而下面被添加到您的構建過程模板

InvokeProcessActivity 
    Name: Call Powershell Version Script 
    Filename: "powershell.exe" 
    Arguments: "-NonInteractive -NoProfile -Command " _ 
       + "c:\Builds\GetAssemblyVersionNumber.ps1" _ 
       + " '" + BuildDirectory + "\Binaries\Foobar.dll'" 
    Handle Standard Output (stdOutput) 

     AssignActivity 
      To: VersionInfo 
      Value: stdOutput 
1

您可以使用MSBuild工作流活動從TFS構建工作流調用MSBuild腳本,並以與往常一樣的方式繼續執行此操作。或者你可以創建一個自定義的工作流程活動來做類似的事情。最好的方式可能取決於你打算如何處理這些版本#。

您可以瞭解如何開始在這裏創建一個自定義活動:http://blogs.msdn.com/b/jimlamb/archive/2010/02/12/how-to-create-a-custom-workflow-activity-for-tfs-build-2010.aspx

還有就是TFS共同體建設具有一堆,你可以使用現成的自定義活動擴展。其中之一被稱爲AssemblyInfo,聽起來很有希望:http://tfsbuildextensions.codeplex.com/documentation

+0

如果你的意思是使用'UpgradeTemplate.xaml'和往常一樣繼續下去,我知道,但這不是主意。我已經檢查了谷歌(包括最後兩個)中的幾乎所有相關鏈接,並且我正試圖將GetAssemblyVersion活動從tfsbuildextensions包括到我的項目中......無論如何,我認爲必須有一個更簡單的方法。 – GoRoS

+0

您不會使用UpgradeTemplate,您將使用DefaultTemplate,您只需自定義DefaultTemplate.xaml文件以包含構建過程所需的額外活動(例如調用自定義TFS活動或使用MSBuild活動調用現有MSBuild文件)。 –

+0

那麼,是否可以使用MSBuild活動來運行我上面發佈的代碼來獲取版本?如果是這樣,你能告訴我怎麼樣? – GoRoS

1

最後,我找到了一個快速簡單的方法來執行我想要的操作。使用一個簡單的分配活動,我寫了下面的代碼:

To:  VersionInfo 
Value: System.Reflection.Assembly.UnsafeLoadFrom(BuildDetail.DropLocation + _ 
     "\MyApplication.exe").GetName().Version.ToString() 

在那之後,我可以使用VersionInfo變量,我想做的事情。我承認我寧願避免使用反思,但這是我找到的不使用第三方庫或自定義活動的簡單方法。

+1

在您的構建代理程序加載二進制文件之後,第一次,構建代理將無法加載程序集的新版本。 –

+0

@ Stanley.Goldman:你說得對,只要裝配具有相同的版本,它將不起作用。我最終使用自定義動態活動並從'AssemblyInfo.cs'文件獲取版本。反思對這種情況總是很危險的。 – GoRoS

相關問題