Msbuild-' DependsOnTargets'包含条件

时间:2016-06-01 14:50:21

标签: msbuild

我尝试在Target代码上设置条件,但导致错误: target has a reference to item metadata. References to item metadata are not allowed in target conditions unless they are part of an item transform.

所以我发现这个工作: How to add item transform to VS2012 .proj msbuild file 并尝试实施它,但我无法弄清楚我做错了什么,因为它没有按预期工作。

<CallTarget Targets="CopyOldWebConfigJs" /> 

<Target Name="CopyOldWebConfigJs" 
            Inputs="@(ContentFiltered)" 
            Outputs="%(Identity).Dummy" 
            DependsOnTargets="webConfigJsCase">

        <Message Text="web.config.js Case" />
</Target>

    <!-- New target to pre-filter list -->
<Target Name="webConfigJsCase"
        Inputs="@(FileToPublish)"
        Outputs="%(Identity).Dummy">
    <ItemGroup>
      <ContentFiltered Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('%(FileToPublish.Filename)%(FileToPublish.Extension)', 'web.config.js'))" />
    </ItemGroup>
</Target>

我认为Inputs="@(ContentFiltered)"将包含DependsOnTargets="webConfigJsCase"找到的行。 但当我运行它时,我收到此消息:Skipping target "CopyOldWebConfigJs" because it has no inputs.

我知道正确正则表达式正常工作,它确实找到了一个等于web.config.js的filename_ext,因此返回True 我做什么或理解错了什么?

1 个答案:

答案 0 :(得分:0)

<ItemGroup><Item/></ItemGroup>中,不会对Item项进行任何更改,因为未指定任何操作。如果要向项目添加条目,则必须指定Include=""

<Item/> documentation描述了<ItemGroup/>内项目元素的各种属性。请注意,在MSBuild文件的顶层,在<Project/>元素的正下方,您将使用属性IncludeExclude,而在<Target/>中您将使用属性IncludeRemove。根本不包括任何属性是荒谬的 - 据我所知 - 与简单地删除整行没有什么不同。我很惊讶MSBuild不会抛出错误或警告这几乎肯定是一个错误,而不是故意的。

Inputs上的Outputs<Target Name="webConfigJsCase"/>属性是不必要的。实际上,它们通过使MSBuild不必要地循环遍历目标来减慢它的速度。您可以像这样过滤<Item/>

<Target Name="webConfigJsCase">
  <ItemGroup>
    <ContentFiltered Condition="'%(FileToPublish.Filename)%(FileToPublish.Extension)' == 'web.config.js'" Include="@(FileToPublish)" />
  </ItemGroup>
</Target>

此外,我假设您希望正则表达式与web.config.js匹配,但不匹配webaconfigbjs。您不需要在此处使用正则表达式等高级功能,因为MSBuild’s built-in condition operators已经支持简单的字符串比较。如果将上述条件修正为更具可读性。