通过批处理另一个ItemGroup创建一个ItemGroup

时间:2014-07-02 01:02:07

标签: msbuild

我需要根据一组动态目录查找文件。这是我的共享构建脚本:

<ItemGroup>
    <LookupDirs Include="F:\Dir1" />
    <LookupDirs Include="F:\Dir2" />
    <LookupDirs Include="F:\Dir3" />
    <LookupDirs Include="@(AdditionalLookupDirs)" />
</ItemGroup>

<!-- This doesn't work. -->
<ItemGroup>
    <Files Include="%(LookupDirs.Identity)\*.ext" />
</ItemGroup>

<Target Name="FilesByBatchingLookupDirs">
    <Message Text="Files: %(Files.Identity)" />

    <!-- This works. --->
    <ItemGroup>
        <TargetFiles Include="%(LookupDirs.Identity)\*.ext" />
    </ItemGroup>

    <Message Text="TargetFiles: %(TargetFiles.Identity)" />
</Target>

目的是让使用构建脚本的人通过AdditionalLookupDirs项目组指定自己的自定义查找目录,然后在查找目录上批处理以查找一组文件。

如果Files项目组不在目标范围内,我更喜欢它,因此我可以简单地创作并且不必记住调用创建Files的目标项目组。不幸的是,看起来这是不可能的。我只能通过在Files中批量处理LookupDirs项目组来创建Target项目组。

是否可以通过批量处理Target之外的现有项目组来创建新的项目组?

1 个答案:

答案 0 :(得分:1)

不,我不相信你可以,但你可以使用InitialTargets。我通常有一个Init目标,因为我无法添加&#34;全球&#34;目标之外的元数据或更高级或延迟的数据输入。

<Project InitialTargets="Init;FilesByBatchingLookupDirs" DefaultTargets="Foo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <LookupDir Include="$(ProgramW6432)\Microsoft SQL Server\100\Tools\Binn" />
        <LookupDir Include="$(ProgramW6432)\Microsoft SQL Server\110\Tools\Binn" />
        <LookupDir Include="$(ProgramW6432)\Microsoft SQL Server\120\Tools\Binn" />
    </ItemGroup>

    <Target Name="Init">
        <ItemGroup>
            <LookupDir>
                <Foo>Bar</Foo>
            </LookupDir>
        </ItemGroup>

        <Message Text="%(LookupDir.Identity) %(Foo)" />
    </Target>

    <Target Name="FilesByBatchingLookupDirs">
        <ItemGroup>
            <Files Include="%(LookupDir.FullPath)\**\*.exe" />
        </ItemGroup>
    </Target>

    <Target Name="Foo" DependsOnTargets="FilesByBatchingLookupDirs">
        <Message Text="%(Files.Identity)" />
    </Target>
</Project>