如何使用OctoPack获取NuGet包名称中的MSBuild内部版本号?

时间:2016-10-19 00:08:26

标签: visual-studio-2015 msbuild tfs2013 octopack

我正在试用Octopus Deploy(3.4.12)并希望自动使用MS Build名称中的内部版本号作为我的NuGet包名称。例如,如果我的最新MSBuild代码名称为 'MyApp Build_20161019.2' ,而我的应用名称为 MyApp ,然后我希望我的包被称为 MyApp.20161019.2.0.nupkg

这样做的原因是应用程序的程序集版本没有变化(历史原因,非负面),所以除非我每次手动将内部版本号作为构建参数传递给OctoPack(这需要自动打包闪亮IMO),我无法将包加载到Octopus库中。

我正在使用老式的TFS XAML构建定义btw。

我应该指出,我找到了一个博客,说创建自定义构建模板并更改Run MSBuild项目,以便参数

String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))

并按照步骤操作,但无法构建并出现以下错误:

  

验证错误:活动的私有实现'1:   DynamicActivity'具有以下验证错误:编译器   遇到处理表达式的错误   “String.Format(”/ p:SkipInvalidConfigurations = true {0}   / p:OctoPackPackageVersion = {1}“,AdvancedBuildSettings.GetValue(Of   String)(“MSBuildArguments”,String.Empty),   BuildDetail.BuildNumber.Split(CCHAR( “_”))(1))”。   无法访问“Microsoft.TeamFoundation.Build.Client.BuildDetail”   在这种情况下,因为它是'朋友'。

1 个答案:

答案 0 :(得分:1)

好的,我在与Git版本相关的类似问题的帮助下找到了如何做到这一点:Add BuildNumber in GitTemplate.12.xaml

  

警告!! AFAIK您将需要VS2013。你不能在VS2015中做到这一点。

为了完整起见,我列出了跳跃所经历的所有燃烧箍步骤。

第一次尝试:

我尝试使用TF_BUILD环境变量TF_BUILD_BUILDNUMBER通过提供以下MSBuild参数来设置OctoPack包编号

  

/ P:RunOctoPack =真   / P:OctoPackPackageVersion =” $(TF_BUILD_BUILDNUMBER)”

但TF_BUILD_BUILDNUMBER包含文字(我认为的应用名称)以及数字,例如 CIBuild_20130613.6 导致NuGet错误,因为NuGet只能处理数字。另外,我真的只想要 20130613.6 部分。

第二次尝试:

研究表明我必须创建一个自定义的构建过程模板。作为起点,我通过编辑现有的构建过程定义(使用默认模板)并单击下载链接来下载默认模板的副本。

enter image description here

接下来,我将模板重命名为 OctoPackBuild.xaml ,并将其添加到TFS中。我把它放在一个名为BuildProcessTemplates的文件夹中,与我想要构建的项目分开,因为这个模板可以用于任何项目。

从技术上讲,您应该创建一个Workflow Activity Library项目并将模板添加到项目中,然后将项目检入TFS,但我发现这是不必要的。如果你想要全身心投入,请参见msdn article

在xaml文件位于TFS之后,您需要在Visual Studio中对其进行编辑以获取对内部版本号的引用。以下步骤来自this msdn question的答案。

a)查看OctoPackBuild.xaml文件并在Visual Studio 2013中打开它。

b)单击xaml编辑器底部的Imports选项卡,然后添加对Microsoft.TeamFoundation.Build.Activities.Extensions的引用。

enter image description here

c)点击' 整体构建流程 '在xaml编辑器中的容器,然后单击底部的“变量”选项卡。添加一个名为BuildDetail的变量,并将其类型设置为IBuildDetail

enter image description here

d)从工具箱中,将 GetEnvironmentVariable 活动拖到更新内部版本号活动之后,并将类型设置为 IBuildDetail 。编辑活动属性;将Name属性设置为 WellKnownEnvironmentVariables.BuildDetail ,将显示名称设置为 '获取构建详细信息' (或任何浮动你的船),结果 BuildDetail < - 这是你创建的变量的名称。

enter image description here

e)现在您可以访问BuildDetail对象,可以将BuildNumber属性传递给MSBuild。通过编辑'运行MSBuild'的CommandLineArguments属性来完成此操作。活动并将值设置为

String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))

您应该注意 BuildDetail 现在指的是您的变量,而不是Microsoft.TeamFoundation.Build.Client.BuildDetail'。

另外,重要的是要理解BuildNumber的格式为[text] _ [numbers]。因此,Split函数正在删除文本部分,只将数字传递给OctoPack。如果你没有拆分BuildNumber,你会导致我在第一次尝试中提到的NuGet问题。这也意味着如果在构建名称中添加额外的下划线,那么您必须选择元素#2,而不是#1。

f)将您的自定义构建模板(OctoPackBuild.xaml)重新检入TFS。

g)接下来,您需要编辑构建过程以使用自定义模板而不是默认模板。

您无法使用VS2015进行此练习的原因是UI不允许您从TFS中选择xaml文件。看起来MS已经用完了预算而且部分UI被破坏了。

VS2010也无法正常工作,因为它无法与TFS 2013模板配合使用。

我让它工作的唯一方法是使用VS2013并从那里编辑Build Process。 VS2013将允许您指定新模板并在TFS中导航以查找您的OctoPackBuild.xaml文件。

h)然后你在构建过程中所要做的就是在MSBuild参数中添加/ p:RunOctoPack = true并且你已经完成了。

enter image description here

希望这有助于某人!