我尝试在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
,我做错了什么或理解错了什么?
发布于 2018-06-14 06:40:45
在<ItemGroup><Item/></ItemGroup>
中,不会对Item
项进行任何更改,因为未指定任何操作。如果要向项中添加条目,则必须指定Include=""
。
documentation描述了<ItemGroup/>
中的item元素的各种属性。请注意,在MSBuild文件的顶层,<Project/>
元素的正下方,您将使用属性Include
和Exclude
,而在<Target/>
中,您将使用属性Include
和Remove
。根本不包含任何属性是毫无意义的,而且-据我所知-与简单地删除整行没有什么不同。我很惊讶MSBuild没有抛出错误或警告,这几乎可以肯定是一个错误,而不是故意的。
<Target Name="webConfigJsCase"/>
上的Inputs
和Outputs
属性是不必要的。事实上,它们会使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已经支持简单的字符串比较。如果修复了上述条件,则会更具可读性。
https://stackoverflow.com/questions/37572074
复制相似问题