如何从属性中提取目录?

时间:2014-12-03 08:03:12

标签: msbuild

我有一个存储完整路径名的属性GroupProj。如何提取属性的目录?

我有以下代码,但它没有按预期工作:

<PropertyGroup>
    <GroupProj>C:\development\project\default.groupproj</GroupProj> 
</PropertyGroup>

<Target Name="Default">
    <Message Text="Echo: $(GroupProj->'%(RootDir)')" />
</Target>

我将描述我这样做的实际意图。也许有办法完成我不知道的工作。

我有一个Delphi groupproj(MSBuild项目)文件,C:\development\project\default.groupproj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Projects Include="project1.dproj">
            <Dependencies/>
        </Projects>
        <Projects Include="project2.dproj">
            <Dependencies/>
        </Projects>
        <Projects Include="project3.dproj">
            <Dependencies/>
        </Projects>
    </ItemGroup>
    ...
</Project>

还有其他3个MSBuild个文件(project1.dprojproject2.dprojproject3.dproj)存储在与default.groupproj相同的文件夹中。

我创建了一个MSBuild项目文件(c:\ test.targets):

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="3.5">
    <Import Project="$(GroupProj)" />
    <Target Name="Build">
        <MSBuild BuildInParallel="True" Projects="project1.dproj;project2.dproj;project3.dproj"/>
    </Target>
</Project>

执行as:

c:\> msbuild /p:GroupProj="C:\development\project\default.groupproj" test.targets

执行失败,因为MSBuild无法找到projectN.dproj文件。问题是工作目录不能设置为default.groupproj

我想到的一个直接的解决方案是提取$(GroupProj)的目录并连接到projectN.dproj文件。

这就是我的问题的全部故事。

1 个答案:

答案 0 :(得分:3)

尝试这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <GroupProj>C:\development\project\default.groupproj</GroupProj> 
    </PropertyGroup>

    <Target Name="Build">
        <CreateItem Include="$(GroupProj)">
          <Output TaskParameter="Include" ItemName="ItemFromProp"/>
      </CreateItem>

      <Message Text="1. @(ItemFromProp -> '%(RootDir)%(Directory)')"/>
      <Message Text="2. %(ItemFromProp.RootDir)%(ItemFromProp.Directory)"/>
      <Message Text="3. %(ItemFromProp.Identity)"/>
      <Message Text="4. %(ItemFromProp.FullPath)"/>
      <Message Text="5. %(ItemFromProp.FileName)"/>
      <Message Text="6. %(ItemFromProp.Extension)"/>
    </Target>
</Project>

编辑:

要并行构建项目,请尝试以下方法:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="GetGroupProjPath">
    <ItemGroup>
      <GroupProj Include="$(GroupProj)" />
      <GroupProjPath Include="@(GroupProj->'%(Directory)')" />
    </ItemGroup>

    <PropertyGroup>
      <GroupProjPath>@(GroupProjPath->'%(RootDir)%(Identity)')</GroupProjPath>
    </PropertyGroup>
  </Target>

  <Import Project="$(GroupProj)" />
  <Target Name="GetDProjs" DependsOnTargets="GetGroupProjPath">
    <ItemGroup>
      <DProjs Include="@(Projects->'$(GroupProjPath)%(FileName)%(Extension)')" />
    </ItemGroup>
  </Target>

  <Target Name="Build" DependsOnTargets="GetDProjs">
    <Message Text="@(DProjs)" />
  </Target>
</Project>