在目标中创建一个项目有什么不同,比如:
<Target Name="DoStuff">
<CreateItem Include="@(IntermediateAssembly)" >
<Output TaskParameter="Include" ItemName="FileWrites"/>
</CreateItem>
</Target>就像这样:
<Target Name="DoStuff">
<ItemGroup>
<FileWrites Include="@(IntermediateAssembly)" />
</ItemGroup>
</Target>你会在什么时候使用其中的一个,为什么?
发布于 2009-06-02 17:23:52
在3.5之前的MSBuild版本中,您不能在目标内部定义属性或项(如第二个示例所示)。因此使用了一个任务(CreateItem和CreateProperty)
如果你使用的是ToolsVersion 3.5,那么你就不需要再使用CreateItem了(尽管如果你愿意,你仍然可以使用)。
最后,它们创建相同的项,具有相同的作用域。使用第二种语法更具可读性,设置自定义元数据也更容易(在我看来)。
注: 3.5版本的MSBuild随.NET 3.5一起安装。尽管您需要在MSBuild文件的Project标记中定义ToolsVersion="3.5"才能使用3.5的特性。
如果你想知道,我从Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build这本书中获得了大部分信息,我真的很喜欢它(但与它没有任何关联)。
发布于 2009-06-27 06:46:56
CreateItem和CreateProperty在MSBuild 3.5中被淘汰了(当然,它们将一直继续工作)。很明显,我们需要相同的语法来让ItemGroup和PropertyGroup在目标内部工作。
但是目标内部的ItemGroup有一些特殊的额外能力。它可以修改项目:例如,这会将true添加到Resources list中的所有项目,这些项目的元数据名为Primary,值为true;只有在还没有Copy metadata的情况下:
<ItemGroup>
<Resources Condition=" '%(Primary)' == 'true' ">
<Copy Condition=" '%(Copy)' == '' ">true</Copy>
</Resources>
</ItemGroup>另一个神奇的功能是:你现在可以从列表中删除项目了。此示例将从资源列表中删除具有值为Bitmap的元数据类型的所有项:
<ItemGroup>
<Resources Condition=" '%(Type)'=='Bitmap' " Remove="@(Resources)"/>
</ItemGroup>这些魔法目前只在内部起作用,不能在外部起作用。
有关这方面的详细信息,我强烈推荐MSBuild上的Sayed Hashimi的书。它很容易在亚马逊上找到。
丹-- msbuild团队。
发布于 2009-06-05 17:37:29
我不认为被接受的答案已经定义了区别。
区别在于:
ItemGroup脚本为loaded.CreateItem时求值MSBuild执行目标时求值这可能会导致脚本中项目的值不同。
以一个任务为例,它处理一个目录中与"*.txt“匹配的所有文件。如果在visual studio中加载了MSBuild脚本,则如果使用ItemGroup,则只有VS启动时存在的文件才会出现在该项中。
如果您使用CreateItem -它将在执行目标时搜索所有*.txt文件。
https://stackoverflow.com/questions/937681
复制相似问题