2009-08-18 49 views
57

我有一個C#項目,名爲MyProject.csproj,位於「C:\ Projects \ MyProject \」。我還有要複製到此項目的輸出目錄中的文件。但是,這些文件位於「C:\ MyContentFiles \」位置,即它們不在項目錐體內。這個目錄也有子目錄。目錄的內容不受管理。因此,我必須包括它下面的所有內容。在.csproj中包含項目外的內容文件

當我將它們作爲「內容」包含在項目中時,它們被複制,但目錄結構丟失。我做了這樣的事情: -

<Content Include="..\..\MyContentFiles\**"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

如何遞歸地複製這些文件/目錄與目錄結構的項目的輸出目錄保存?

回答

33

您需要添加文件作爲鏈接:

  1. 右鍵點擊VS.項目
  2. Add - > Existing Item ...
  3. 找到文件。
  4. 選擇它。
  5. 添加爲鏈接(在對話框中的添加按鈕中下拉菜單)。
  6. 打開文件的屬性並將「複製到輸出目錄」設置爲「始終複製」。

但是你不能這樣做的目錄樹。
相反,您需要爲此編寫後期構建任務。 This is a sample這會讓你盯上。

+5

正如[這個答案](HTTP陳述://stackoverflow.com/a/11808911/1576096),「你不能爲目錄樹做它。」聲明不真實。 – Mandark 2013-06-13 13:00:49

8

以下內容將添加到項目文件的底部,它會將維護目標結構的內容文件複製到構建目標目錄$(TargetDirectory)(通常爲$(MSBuildProjectDirectory)\bin\Debug)中。

<ItemGroup> 
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" /> 
</ItemGroup> 

<Target Name="AfterBuild"> 
    <Copy 
     SourceFiles="@(ExtraContent)" 
     DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
     SkipUnchangedFiles="true" /> 
</Target> 

如果在指定的目錄MyContentFiles去需要這些文件,你可以在副本之前補充一點:

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " /> 

,改變

<Copy 
      SourceFiles="@(ExtraContent)" 
      DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="true" /> 

<Copy 
      SourceFiles="@(ExtraContent)" 
      DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="true" /> 
+1

你的變換有一個類型o:@(ExtraContent) - >'...')應該是@(ExtraContext - >'...')。否則很好的答案! – alexdej 2010-10-06 04:27:42

+0

@Todd 1)如果從MyContentFiles存儲中刪除文件,會發生什麼情況?它看起來不像將從解決方案目錄中刪除2)是否有任何方法讓Visual Studio在運行完成後從$(SolutionDir)中刪除這些文件。離開他們可能會混淆其他開發者。 – Adam 2013-11-21 12:08:13

106

我相信@Dmytrii一方面可以正確使用 - 您想使用「鏈接」功能。

但是,他說只有部分正確的時候說你不能鏈接到一個目錄樹。 當嘗試使用Visual Studio的GUI添加鏈接時確實如此,MSBuild支持這一點。

如果你想保留目錄結構,只是%(RecursiveDir)標籤添加到您的<link>節點:

<Content Include="..\..\MyContentFiles\**\*.*"> 
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

MSBuild Well-known Item Metadata進入您可以訪問元數據的詳細信息。

+1

1)如果從Shared Assets存儲中刪除文件,會發生什麼情況?它看起來不像將從解決方案目錄中刪除2)是否有任何方法讓Visual Studio在運行完成後從$(SolutionDir)中刪除這些文件。離開他們可能會混淆其他開發者。 – Adam 2013-11-21 12:07:36

+0

@亞當看到我的回答如下 – 2014-10-05 22:58:02

+4

由於食物,水和亟需陪伴的曠野在荒野中墜毀,我覺得這個答案很有幫助。按照這些指示,我能夠建立一個全功能的AI,現在已經取代了曾經在荒野中縈繞在我身邊的所有人類需求。謝謝Mandark! – deepelement 2014-12-16 17:45:32

23

Mandark的答案直接將內容文件添加到解決方案,它們將顯示在解決方案資源管理器中。無論何時在原始目錄中添加或刪除文件,Visual Studio都不會自動提取此文件。此外,無論何時在解決方案資源管理器中刪除或添加文件,項目文件都會被更改,並且所有文件都將單獨包含在內,而不僅僅包括該文件夾。

爲了防止出現這種情況,您可以使用相同的技巧,但將其放入單獨的項目文件中,然後導入它。

項目文件(例如include.proj)看起來是這樣的:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<ItemGroup> 
<Content Include="..\..\MyContentFiles\**"> 
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 
</ItemGroup> 
</Project> 

在自己的項目文件,添加以下行

<Import Project="include.proj" /> 

Visual Studio將不會惹這個文件,並且只是在構建過程中將文件添加爲內容。始終包括原始目錄中的更改。這些文件不會顯示在您的解決方案資源管理器中,但會包含在輸出目錄中。

這一招在這裏撿到:http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

+1

出於某種原因,這似乎不適用於我使用.proj文件,但我能夠使它與.csproj文件一起工作。 – StriplingWarrior 2014-10-29 18:59:16

+5

您可以將 true添加到Content元素以使項目出現在解決方案資源管理器中。 – 2015-01-14 23:41:21

+0

Mine只是一個.proj – 2016-02-05 19:58:02

3

我覺得

<Content Include="..\..\MyContentFiles\**\*.*"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

僅僅是不夠的,因爲你想要的文件夾中的一切都和子文件夾

相關問題