我尝试在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
我做什么或理解错了什么?
答案 0 :(得分:0)
在<ItemGroup><Item/></ItemGroup>
中,不会对Item
项进行任何更改,因为未指定任何操作。如果要向项目添加条目,则必须指定Include=""
。
<Item/>
documentation描述了<ItemGroup/>
内项目元素的各种属性。请注意,在MSBuild文件的顶层,在<Project/>
元素的正下方,您将使用属性Include
和Exclude
,而在<Target/>
中您将使用属性Include
和Remove
。根本不包括任何属性是荒谬的 - 据我所知 - 与简单地删除整行没有什么不同。我很惊讶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已经支持简单的字符串比较。如果将上述条件修正为更具可读性。