如何在Team Build 2010工作流中获取程序集的版本

4
有没有办法像我们之前在Team Build 2010 Workflow中使用Msbuild一样获取程序集的版本号?以下是一个简单的示例,展示了如何使用%(Info.Version)来获取程序集的版本号。
  <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个回答

3

GoRoS有一个正确的思路,但它只在第一次运行时有效。

为了避免这个问题,你需要在不同的AppDomain中运行这段代码或类似的代码,Build Agent、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

最后我找到了一种快速简单的方法来执行我想要的操作。使用一个简单的分配活动,我编写了以下代码:

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

之后,我可以随心所欲地使用VersionInfo变量。我知道我更喜欢避免使用反射,但这是我找到的简单和快捷的方法,它不使用第三方库或自定义活动。


1
在您的构建代理程序第一次加载二进制文件后,该构建代理程序将无法加载程序集的新版本。 - Stanley.Goldman
@Stanley.Goldman:你说得对,只要程序集版本相同就可以工作。我最终使用自定义动态活动并从“AssemblyInfo.cs”文件中获取版本来解决了这个问题。反射在这种情况下总是很危险的。 - GoRoS

1

您可以使用MSBuild Workflow Activity从TFS Build Workflows调用MSBuild脚本,并像往常一样继续执行此操作。或者,您可以创建自定义Workflow Activity来完成类似的事情。最好的方法可能取决于您打算如何处理这些版本号。

您可以在此处阅读有关如何开始创建自定义活动的信息:http://blogs.msdn.com/b/jimlamb/archive/2010/02/12/how-to-create-a-custom-workflow-activity-for-tfs-build-2010.aspx

此外,还有TFS Community Build Extensions,其中包含许多现成的自定义活动可供使用。其中之一称为AssemblyInfo,听起来很有前途:http://tfsbuildextensions.codeplex.com/documentation


如果你的意思是像往常一样使用 UpgradeTemplate.xaml,我知道了,但这不是我的想法。我已经在谷歌上检查了几乎所有相关链接(包括最后两个),并且正在尝试从tfsbuildextensions中将GetAssemblyVersion活动包含到我的项目中...无论如何,我认为必须有更简单的方法。 - GoRoS
你不会使用UpgradeTemplate,而是使用DefaultTemplate,只需自定义DefaultTemplate.xaml文件以包含构建过程所需的额外活动(例如调用自定义TFS活动或使用MSBuild活动调用现有的MSBuild文件)。 - Dylan Smith
那么,使用MSBuild活动运行我上面发布的代码以获取版本号是否可行?如果可以,请问你能演示一下吗? - GoRoS
就像我说的,这取决于你打算用它做什么。你肯定可以调用那个MSBuild脚本,它会愉快地将版本号存入内存,然后终止并丢弃它,因为MSBuild脚本实际上并不对其执行任何操作。如果你使用MSBuild来检索它,那么你必须使用MSBuild来执行你计划使用该信息所需的任何操作。 - Dylan Smith
但是怎样运行我的MSBuild脚本代码在我的TFS 2010 Build中呢?您能否请更加精确地说明一下呢? - GoRoS
看看这篇博客文章,了解如何自定义TFS Build工作流程的详细步骤。在不使用博客文章中提到的WriteBuildMessage活动的情况下,只需添加MSBuild活动即可。http://www.ewaldhofman.nl/post/2010/04/27/Customize-Team-Build-2010-e28093-Part-2-Add-arguments-and-variables.aspx - Dylan Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接