2011-03-03 62 views
0

這看起來應該很簡單,但我無法從該參考中找到它,而且我的google-fu顯然很弱。在MSBuild中包含具有單獨指定目錄的文件

我只想單獨指定文件名和基礎文件夾中生成文件...

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <TestFilesWithFolder> 
     B:\Root\Test1.*; 
     B:\Root\Test2.* 
    </TestFilesWithFolder> 
    <TestFiles>Test1.*;Test2.*</TestFiles> 
    <TestFileRoot>B:\Root</TestFileRoot> 
    </PropertyGroup> 
    <Target Name="Build"> 
    <ItemGroup> 
     <TestFilesGroupWithFolder Include="$(TestFilesWithFolder)" /> 
     <TestFilesGroup Include="$(TestFileRoot)\$(TestFiles)" /> 
    </ItemGroup> 
    <Warning Text="Source files with folder: @(TestFilesGroupWithFolder)" /> 
    <Warning Text="Source files: @(TestFilesGroup)" /> 
    </Target> 
</Project> 

當我運行此,第一次警告顯示這兩個文件的預期,但第二次警告只能說明第一個文件(因爲直串字符串將文件夾名稱放在第一個文件夾上,但不是第二個文件夾)。

我該如何獲得ItemGroup「TestFilesGroup」包含給定「TestFiles」和「TestFileRoot」屬性的文件?

回答

3

可以將一個分號分隔的事物列表轉換爲一個項目,除非屬性中的項目包含通配符,否則這將成爲可能,因此如果您希望MSBuild將它們視爲列表中的項目,在MSBuild首次看到它的路徑必須是有效的。可能有辦法做到這一點,但我想不出一個。換句話說...

<ItemGroup> 
    <TestFiles Include="$(TestFiles)" /> 
</ItemGroup> 

...只有工作,如果$(TestFiles)包含的任何事情沒有通配符,或實際存在的限定路徑的分隔列表。

此外,MSBuild無法在Include屬性內組成一個帶有通配符的路徑並同時對其進行評估,因此您需要一個技巧來首先單獨編寫完整路徑,然後將其饋送到Include屬性中。以下內容將起作用,但它需要將您的分隔屬性更改爲一組項目。它在這個項目列表上分配一個依賴目標,每個批量目標執行計算一個項目的元值,這個項目被存儲在一個新的元值中。當原始目標執行時,它可以在隨後的包含中使用該元值。

<PropertyGroup> 
    <TestFilesWithFolder> 
    D:\Code\Test1.*; 
    D:\Code\Test2.* 
    </TestFilesWithFolder> 
    <TestFileRoot>D:\Code</TestFileRoot> 
</PropertyGroup> 
<ItemGroup> 
    <TestFilePattern Include="TestFilePattern"> 
    <Pattern>Test1.*</Pattern> 
    </TestFilePattern> 
    <TestFilePattern Include="TestFilePattern"> 
    <Pattern>Test2.*</Pattern> 
    </TestFilePattern> 
</ItemGroup> 
<Target Name="Compose" Outputs="%(TestFilePattern.Pattern)"> 
    <ItemGroup> 
    <TestFilePattern Include="TestFilePattern"> 
     <ComposedPath>@(TestFilePattern->'$(TestFileRoot)\%(Pattern)')</ComposedPath> 
    </TestFilePattern> 
    </ItemGroup> 
</Target> 
<Target Name="Build" DependsOnTargets="Compose"> 
    <ItemGroup>  
    <TestFilesGroupWithFolder Include="$(TestFilesWithFolder)" /> 
    </ItemGroup> 
    <Warning Text="Source files with folder: @(TestFilesGroupWithFolder)" /> 
    <ItemGroup> 
    <ComposedTestFiles Include="%(TestFilePattern.ComposedPath)" /> 
    </ItemGroup> 
    <Warning Text="Source files: @(ComposedTestFiles)" /> 
</Target> 

將會產生以下的輸出:

(Build target) -> 
d:\Code\My.proj(80,5): warning : Source files with folder: 
    D:\Code\Test1.txt;D:\Code\Test2.txt 
d:\Code\My.proj(84,5): warning : Source files: 
    D:\Code\Test1.txt;D:\Code\Test2.txt 
+0

謝謝你的非常詳細的解答。花了我一段時間來弄清這些模式是如何相關的,但現在我已經開始工作了。 – Zarigani 2011-04-06 20:19:05

相關問題