【问题标题】:How to get MSBuild build number in name of NuGet package using OctoPack?如何使用 OctoPack 以 NuGet 包的名称获取 MSBuild 内部版本号?
【发布时间】:2016-10-19 00:08:26
【问题描述】:

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

这样做的原因是应用程序的程序集版本没有改变(历史原因,非否定),所以除非我每次都手动将内部版本号作为构建参数传递给 OctoPack(这会使自动打包失去光泽IMO),我无法将包加载到 Octopus 库中。

顺便说一句,我使用的是老式 TFS XAML 构建定义。

我应该指出,我发现一个博客说要创建一个自定义构建模板并更改 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' 不可访问 在这种情况下,因为它是“朋友”。

【问题讨论】:

    标签: visual-studio-2015 msbuild octopack


    【解决方案1】:

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

    警告!! AFAIK 你将需要 VS2013 来解决这个问题。在VS2015中你不能这样做。

    为了完整起见,我列出了我必须 跳跃 经历的所有 flaming hoops 步骤。

    第一次尝试:

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

    /p:RunOctoPack=true /p:OctoPackPackageVersion=”$(TF_BUILD_BUILDNUMBER)”

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

    第二次尝试:

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

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

    从技术上讲,您应该创建一个工作流活动库项目并将模板添加到项目中,然后将该项目签入 TFS,但我发现这没有必要。如果您想全力以赴,请参阅msdn article

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

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

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

    c) 在 xaml 编辑器中单击“Overall build process”容器,然后单击底部的变量选项卡。添加一个名为 BuildDetail 的变量,并将其类型设置为 IBuildDetail

    d) 从工具箱中,将 GetEnvironmentVariable 活动拖到 Update Build Number 活动之后,并将类型设置为 IBuildDetail .编辑活动属性;将 Name 属性设置为 WellKnownEnvironmentVariables.BuildDetail,将 Display Name 设置为 'Get Build Details'(或任何浮动你的船),结果到 BuildDetail

    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 并从那里编辑构建过程。 VS2013 将允许您指定一个新模板并在 TFS 中导航以找到您的 OctoPackBuild.xaml 文件。

    h) 那么您在构建过程中所要做的就是将 /p:RunOctoPack=true 添加到 MSBuild 参数中,然后您就完成了。

    希望这对某人有所帮助!

    【讨论】:

    • @Cece-MSFT 是的,我会这样做。我只需要等待 2 天,因为这是我自己问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多