【问题标题】:Setting an item metadata using a property使用属性设置项目元数据
【发布时间】:2010-11-27 07:49:38
【问题描述】:

我一直在尝试使我的 TFS 构建中的任务更通用,我想做的一件事是根据使用该任务的构建将一些文件复制到不同的目录。我玩弄了使用属性的想法,但我想不出一种干净的方法,所以我尝试使用项目元数据,因为我已经能够在同一个目标文件的另一个地方这样做我正在努力,只是这一次,我想使用属性。

这是我想做的:

<ItemGroup>
  <DestinationParent Include="$(DeploymentPath)">
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
  </DestinationParent>
</ItemGroup>

在构建的后期,我尝试通过引用项目元数据将一些文件复制到目标文件夹:

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy>

不幸的是,构建运行后,我的 BuildLog 显示如下:

Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>".

%(DestinationParentPath) 已扩展为空字符串,无论出于何种原因。使用 %(DestinationParent.DestinationParentPath) 会产生错误,告诉我我应该简单地使用 %(DestinationParentPath)。 $(DeploymentPath) 在构建中的其他几个地方按预期扩展为正确的字符串。

另一个混淆来源是使用 %(ConfigurationToBuild.FlavorToBuild) 产生了正确的值,即 Test,如下所示:

编辑:这是在根节点 Project 下定义的,而具有 DestinationParentPath 的 ItemGroup 是在 Target 节点下定义的。这也有影响吗?

<ItemGroup>
  <ConfigurationToBuild Include="Test|Any CPU">
    <FlavorToBuild>Test</FlavorToBuild>
    <PlatformToBuild>Any CPU</PlatformToBuild>
  </ConfigurationToBuild>
</ItemGroup>

当您只对项目元数据中的字符串感兴趣时,似乎 Include 属性并不相关,因为我很确定“Test|Any CPU”没有引用任何实际文件。

再一次,为什么 %(DestinationParentPath) 会扩展为空字符串?

编辑:我忘了提到我还尝试硬编码 DestinationParentPath 的实际路径,但这仍然导致 %(DestinationParentPath) 扩展为空字符串。

【问题讨论】:

    标签: tfs msbuild msbuild-task tfsbuild


    【解决方案1】:

    编辑:这是在根节点 Project 下定义的,而具有 DestinationParentPath 的 ItemGroup 是在 Target 节点下定义的。这也有影响吗?

    是的,它有所作为。在 Target 中定义 ItemGroup 的功能是 msbuild 3.5 的新增功能。尽管看起来是声明性的,但它实际上是在运行时执行的,就像您调用旧样式的 CreateItem / CreateProperty 任务一样。仅此一项就会导致潜在的问题:您需要考虑何时(首先)调用包含任务。 Order of operations is not always obvious to the naked eye。让使用 %(DestinationParentPath) 的任务依赖于创建它的任务可能是明智的,即使没有“逻辑”依赖关系。

    此外,还有一些古老的 msbuild 范围界定怪癖/错误。 Dynamically created properties & items are not visible to "sibling" tasks。另外,items updated in nested builds aren't always bubbled up

    查看链接中的解决方法,您应该能够找到适合您的东西,即使它很讨厌。

    【讨论】:

    • 感谢您的回答和链接...想出了如何解决我的问题:) (是的,它有点恶心,但它仍然很好用)一个仍然令人困惑的问题我虽然:似乎我上面提到的 %(Configuration.FlavorToBuild) 被视为全局......项目?这就是我能够在该领域的其他部分使用它的原因吗?
    • 配置项是由 Team Build 在流程的早期设置的,所以我并不惊讶它可以在您的脚本中运行而无需任何额外工作。 ///// 也许“范围”是错误的词。属性和项目在 msbuild 中始终是“全局的”,因为 $(foo) 总是指“相同的”$(foo),无论它出现在哪里。 C# 类比:想象没有命名空间关键字,只有 1 个类定义。通常,我们总是通过引用传递此类的单个实例。第一个链接描述了流量控制。后两者描述了传入/传出过时副本的怪癖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多