2011-05-06 74 views
15

在清理我繼承的項目上的文件夾/文件結構的過程中,我遇到了組織所需外部庫的問題。我想讓它們保留在自己的.\dll\文件夾中,但它們不會被正確地複製到構建目錄。它們應該位於根目錄中,但它們將被轉移到子文件夾中。MSBuild項目文件:將項目複製到輸出目錄中的特定位置

.csproj文件包含以下XML:

<Project> 
    <ItemGroup> 
    <None Include="dlls\libraryA.dll"> 
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
    </ItemGroup> 
</Project> 

然後,在打造,libraryA.dll文件複製到該文件夾​​bin\Debug\dll\,但我想它在bin\Debug\文件夾中。

回答

13

我嘗試這樣做的MSBuild總是想用自己的目錄路徑要複製的文件,但有一個解決辦法...

編輯的csproj文件,該行後:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

添加這些行:

<PropertyGroup> 
    <PrepareForRunDependsOn>$(PrepareForRunDependsOn);MyCopyFilesToOutputDirectory</PrepareForRunDependsOn> 
    </PropertyGroup> 

    <Target Name="MyCopyFilesToOutputDirectory"> 
    <Copy SourceFiles="@(None)" DestinationFolder="$(OutDir)" /> 
    </Target> 

輸出文件的副本發生在PrepareForRun目標中。這會將您自己的目標添加到作爲PrepareForRun一部分執行的目標列表中。

本示例複製無項目組中的所有項目。您可以創建自己的項目組(例如MyFiles),並在該項目組上覆制該項目組,如果您有其他不需要複製的「無」文件。當我嘗試這個時,我必須通過直接編輯csproj文件來更改項目組名稱。 Visual Studio不允許我從UI設置文件的項目組,但在編輯csproj並對其進行更改後,Visual Studio正確顯示了我的自定義項目組名稱。

+4

就像一個夢,謝謝!爲了引用其他人,我最終創建了自己的組名(即''),然後,我只需確保CopyToOutputDirectory選項設置爲Never(即默認)。 – chezy525 2011-05-07 01:00:18

+1

剛剛偶然發現這個解決方案 - 真棒!!!!!我還要補充一點,如果你不僅僅有一個簡單的目錄結構,你可以將'DestinationFolder =「$(OutDir)''改成'DestinationFolder =」$(OutDir)\%(RecursiveDir)「'如果你只想每次都複製更新的文件,請添加額外的'SkipUnchangedFiles =「true」。@BrianWalker - 你是一個瘋狂的冠軍!!!!! – 2013-11-14 20:44:21

+0

如果有幫助,對於有同類問題的其他人,我在這裏使用此邏輯評論我的解決方案:http://stackoverflow.com/a/19989390/1693085 – 2013-11-14 22:08:20

相關問題