在MsBuild中,PropertyGroup和ItemGroup有什么区别?

32

我可以编译由PropertyGroup引用的.cs 文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <AssemblyName>MSBuildSample</AssemblyName>
        <OutputPath>Bin\</OutputPath>
        <Compile>helloConfig.cs</Compile>
    </PropertyGroup>

    <Target Name="Build">
        <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
        <Csc Sources="$(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe"/>
    </Target>        
</Project>

或者使用ItemGroup执行相同的操作:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
    <ItemGroup>
        <Compile Include="helloConfig.cs" />
    </ItemGroup>

    <PropertyGroup>
        <AssemblyName>MSBuildSample</AssemblyName>
        <OutputPath>Bin\</OutputPath>
    </PropertyGroup>

    <Target Name="Build">
        <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
        <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe"/>
    </Target>  
</Project>

我知道使用ItemGroup应该是首选方法,但是什么时候应该使用每个属性呢?

1个回答

32

将属性组想象为一组单独的变量,属性只能保存一个值。

而itemgroup类似于数组或集合,可以保存零个、一个或多个值。您还可以迭代itemgroup,这在您希望对多个项目执行相同任务时通常很有用。这种情况的常见示例是编译多个文件。


6
ItemGroup的值也可以有多个属性,包括定义了一个“模式”。属性严格限定为单个字符串值。 - Richard Szalay
@David 对于这个差异的解释很好。我觉得我可以在我的用例中使用ItemGroup,“将来自不同源路径的文件/目录复制到具有相同子目录的部署路径”。即,将xyz*.dll复制到deploy\xyz*.dll;将abc\images*.jpg复制到deploy\abc\images*.jpg(在这里,我想使用一个单一任务来执行这100多个副本)。你能展示一下它是如何工作的吗?(详细要求已在https://stackoverflow.com/questions/53544528/build-script-to-copy-files-from-various-source-folder-to-various-destination-fol/53547258#53547258中解释) - OmGanesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接