2014-12-03 76 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

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

而作爲執行:

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

執行應爲MSBuild失敗找不到projectN.dproj文件。問題應該是工作目錄未設置爲default.groupproj

進入我腦海的一個直接解決方案是提取$(GroupProj)目錄並將concat文件提取到那裏projectN.dproj文件。

這就是我的問題的全部內容。

+1

儘量只'<消息文本=「回聲:$(GroupProj - >%(RootDir))「/>'。關閉選民,這不是重複的! OP希望在MSBuild中打印出一個['知名的項目'](http://msdn.microsoft.com/en-us/library/ms164313.aspx)'%(RootDir)'。 – TLama 2014-12-03 09:50:02

+1

@TLama謝謝你糾正我。德爾福的標籤讓我感到困惑。我已經刪除它。 – 2014-12-03 10:07:10

+0

@Chau,你究竟會迴應什麼?你可以只爲項目獲得那些衆所周知的元數據(節點''),但是我不清楚你要輸出什麼。請你詳細說明一下嗎? – TLama 2014-12-03 11:08:33

回答

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項目,或者你應該嘗試從這裏的答案http://stackoverflow.com/questions/9865641/build-modules/smsppild.mspild直接與MsBuild的msbuild「C:\開發\項目\ default.groupproj」 all-projects-in-a-directory – Rolo 2014-12-03 15:49:06

+0

我正在使用多核CPU。來自'Delphi'的default.groupproj不會並行構建所有的'dproj's。任何時候只執行一項任務。我正在考慮使用'BuildInParallel'從最初的'default.groupproj'派生一個新的'msbuild' groupproj。 – 2014-12-03 21:39:03

+0

@ChauCheeYang看看我的編輯。這應該有助於您並行地構建項目。 – Rolo 2014-12-04 00:16:10