2014-12-03 5 views
4

전체 경로 이름을 저장하는 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 있습니다

default.groupproj과 동일한 폴더에 저장된 다른 3 개 MSBuild 파일 ( project1.dproj, project2.dprojproject3.dproj)가 있습니다
<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> 

. (: \ test.targets C) :

<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> 

을하고 실행합니다

은 내가 MSBuild 프로젝트 파일을 생성 한 실행 projectN.dproj 파일을 찾을 수 없습니다 MSBuild으로 실패 할 것이다

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

. 문제는 작업 디렉토리가 default.groupproj으로 설정되어 있지 않아야합니다.

하나의 스트레이트 솔루션은 $ (GroupProj)의 디렉토리를 추출하고 거기에 projectN.dproj 파일을 연결하는 것입니다.

그건 내 질문의 전체 이야기입니다.

+1

그냥'<메시지 텍스트를 시도 = "에코 : $ (GroupProj -> % (RootDir)) "/>'. 투표자를 닫으십시오. 중복이 아닙니다! OP는 MSBuild에서 [잘 알려진 항목] (http://msdn.microsoft.com/en-us/library/ms164313.aspx)'% (RootDir)'을 출력하려고합니다. – TLama

+1

@ TLama 저를 시정 해 주셔서 감사합니다. 델파이 태그는 나 혼란 스러웠다. 나는 그것을 지금 제거했습니다. –

+0

@ Chau, 정확하게 에코 할거야? 항목 (노드 '')에 대해서만 잘 알려진 메타 데이터를 가져올 수 있지만 출력 할 내용이 명확하지 않습니다. 이거 좀 더 자세히 설명해 주시겠습니까? – TLama

답변

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> 
+0

@ChauCheeYang 위의 예에서 질문에 대한 답을 얻었지만 문제가 해결되지는 않습니다. 문제를 해결할 수 없다면 기본값을 호출해야합니다..group proj가 msbuild 프로젝트이거나 여기에서 대답을 시도해야하기 때문에 groupproj가 MsBuild의 msbuild "C : \ development \ project \ default.groupproj"와 직접 연결됩니다. http://stackoverflow.com/questions/9865641/build- 디렉터리에있는 모든 프로젝트 – Rolo

+0

멀티 코어 CPU를 사용하고 있습니다. 'Delphi'의 default.groupproj는 모든'dproj'를 병렬 적으로 빌드하지 않습니다. 언제든지 하나의 작업 만 실행되었습니다. 나는'BuildInParallel'을 활용하여 원래'default.groupproj'에서 새로운'msbuild' groupproj를 파생시킬 생각입니다. –

+0

@ChauCheeYang이 제 편집을 봅니다. 그러면 프로젝트를 병렬로 구축하는 데 도움이됩니다. – Rolo

관련 문제