2012-02-10 77 views
1

我建設有MSBuild的Visual Studio解決方案結構解決方案outputpath通過項目

msbuild.exe my.sln 

這樣,它輸出的一切在每個項目(默認BIN \)指定的輸出路徑,但在這種情況下,我需要將所有輸出的文物放在不同的文件夾中,用於包裝。如果我運行

msbuild.exe my.sln /p:OutputhPath=<someFolder> 

然後所有的工件將在指定的文件夾中結束,但結構將是平坦的。我想什麼它是,就是:

\package 
    \project1 
    \project2 
    ... 

但我想不出一個好辦法做到這一點,而不需要修改個別項目文件(這幾乎是毫無疑問的)。有任何想法嗎? (MSBuild的4.0,VS2010 - 如果改變任何東西)

+0

感謝downvote,不管是誰。解決方法可能是運行powershell腳本來修改項目文件,然後構建它們,然後撤消修改 - 似乎只有MSBuild才能做到這一點 – Hassan 2012-02-14 15:36:37

+0

有些人只是奇怪不是他們。我認爲這是一個很好的問題。 – 2013-04-16 11:20:32

回答

2

有可能是一個更好的辦法,但有一兩件事你可以做的是msbuild.exe my.sln建設到位,然後將輸出複製到\package目錄,所以你保持層次。這應該很簡單。您可以使用此作爲起點:

<Target Name="Package"> 
    <PropertyGroup> 
     <SourceFolder>$(MSBuildProjectDirectory)\src</SourceFolder> 
     <TargetFolder>$(MSBuildProjectDirectory)\package</TargetFolder> 
    </PropertyGroup> 

    <ItemGroup> 
     <FilesToCopy Include="$(SourceFolder)\**\bin\Debug\**\*.*" /> 
    </ItemGroup> 

    <!-- Recursive copy w/o flattening folder structure: --> 
    <Copy 
     SourceFiles="@(FilesToCopy)" 
     DestinationFiles="@(FilesToCopy->'$(TargetFolder)\%(RecursiveDir)%(Filename)%(Extension)')" 
     /> 
    </Target> 

您還可以定義一個屬性來跟蹤你的構建配置,並與bin\$(BuildConfig)更換硬編碼bin\Debug

+0

一個好主意,但%(RecursiveDir)會給我完整的路徑,不僅是項目名稱 - 在我的情況下,這可能是一個很長的路徑。 – Hassan 2012-02-10 17:32:39

+0

%(RecursiveDir)應該只給出與通配符(**)相匹配的部分,因此如果您的項目都直接位於src \文件夾下,則只需獲取項目名稱即可。如果您有不同的文件夾結構,也許可以使用字符串函數來修改元屬性。請參閱此處以獲取更多信息:http://msdn.microsoft.com/en-us/library/ms164313.aspx – 2012-02-10 17:46:25

+0

爲您完成此項工作?如果是,你能接受答案嗎? – 2012-02-12 17:11:26