【问题标题】:How do I keep Build parameters alive in TFS Build (TFS server 2017 and build agent 2013)如何在 TFS 构建中保持构建参数有效(TFS 服务器 2017 和构建代理 2013)
【发布时间】:2018-03-11 17:27:04
【问题描述】:

我正试图找出我的构建失败的原因,所以在我添加的构建调用的 .proj 中:

<Message Text="System Drive: $(SystemDrive)"/>
<Message Text="BuildAgtentId: $(BuildAgentId)" />
<Message Text="BuildDefinitionPath: $(BuildDefinitionPath)" />
<Message Text="SourceDir: $(SourceDir)" />
<Message Text="SrcDir: $(SrcDir)" />
<Message Text="BuildDefinitionPath: $(BuildDefinitionPath)." />
<Message Text="BuildDefinitionId: $(BuildDefinitionId)." />
<Message Text="TF_BUILD_BUILDDIRECTORY: $(TF_BUILD_BUILDDIRECTORY)" />

现在在执行此操作时,我假设 $(SourceDir) 将解析为 C:\Builds\$(BuildDefinitionId),因为这是我的代理工作目录设置中的内容。我还在 MSBuild 参数中设置了一个变量:

/p:SrcDir=$(SourceDir)  

但是当 .proj 运行时,这是我的输出:

System Drive: C:
BuildAgtentId: 
BuildDefinitionPath: 
SourceDir: 
SrcDir: $(SourceDir)
BuildDefinitionPath: .
BuildDefinitionId: .
TF_BUILD_BUILDDIRECTORY: .

所以在构建过程中似乎只有 $(SystemDrive) 存在。而且我在 MSBuild args 中设置的参数似乎甚至没有正确设置(SrcDir)。如何在构建过程中访问这些变量,以便知道我的文件在哪里?我需要调用一些其他程序(即 attrib)并传入我的文件的位置,但似乎没有什么能持续存在。

根据this 文章,我确信 TF_BUILDDIRECTORY 会起作用,但它不起作用。

然后我尝试使用 this 文章说这应该有效:

<GetBuildProperties TeamFoundationServerUrl="$(TFSTeamFoundationServerUrl)" BuildUri="$(BuildUri)">
  <Output TaskParameter="BuildDirectory" PropertyName ="TFSBuildDirectory" />
  <Output TaskParameter="TeamProject" PropertyName="TFSTeamProject" />
</GetBuildProperties>

<Message Text="BuildLocation: $(TFSBuildDirectory)." />
<Message Text="TeamProject: $(TFSTeamProject)."/>

虽然 TeamProject 有效,但 BuildDirectory 无效。所以我明白了:

BuildLocation: .
TeamProject: MDRVIDEOTOUCH.

【问题讨论】:

    标签: tfs msbuild tfsbuild xamlbuild


    【解决方案1】:

    您需要使用XAML build environment variables

    其中一些值不可用,但您可以获取其中一些值:

    • TF_BUILD_BUILDDIRECTORY 构建代理工作目录。例如:C:\Build\BuildBot3\CoolApp\CIBuild。
    • TF_BUILD_BUILDNUMBER 构建的构建号。例如:CIBuild_20130613.6。
    • TF_BUILD_SOURCESDIRECTORY 构建代理工作目录的源子目录。此目录包含您的源代码。例如:C:\Build\BuildBot3\CoolApp\CIBuild\src。

    【讨论】:

    • 谢谢丹尼尔,但是当我刚刚更新了上面的问题时,我尝试了 TF_BUILD_BUILDDIRECTORY 并且它似乎也是空白的(除非我引用它错误。我正在使用 $(TF_BUILD_BUILDDIRECTORY) - 对吗?
    【解决方案2】:

    您需要通过 MSBuild 参数将值传递给 MSBuild 任务。

    1. 在项目文件的 PropertyGroup 部分定义属性,例如 &lt;PropertyGroup&gt;&lt;SourceDir&gt;&lt;/SourceDir&gt;&lt;BuildDefinitionName&gt;&lt;/BuildDefinitionName&gt;&lt;/PropertyGroup&gt;
    2. 指定 MSBuild 参数:/p:SourceDir="$(TF_BUILD_BUILDDIRECTORY)" /p: BuildDefinitionName="$(TF_BUILD_BUILDDEFINITIONNAME)"

    另一方面,MSBuild中有一些变量,你可以查看这个帖子:How can I get current directory in msbuild script?

    【讨论】:

    • 谢谢,但这不起作用。我在构建定义中设置 /p:SourceDir="$(TF_BUILD_BUILDDIRECTORY)" 然后在 .proj 文件中设置 我得到的值:InitVariables: SourceDir: $(TF_BUILD_BUILDDIRECTORY)。所以 TF_BUILD_BUILDDIRECTORY 没有被翻译 - 它被视为文字。
    • @Ben_G 您需要在MSBuild中直接使用SourceDir,例如:&lt;Message Importance="high" Text="InitVariables : $(SourceDir)"/&gt;。 ($(TF_BUILD_BUILDDIRECTORY) 用于 TFS 构建活动)
    • @Ben_G 试了有什么结果?
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多