在项目锥体之外的.csproj中包含内容文件

我有一个C#项目说:位于“C:\ Projects \ MyProject \”MyProject.csproj。 我也有我想要复制到这个项目的输出目录的文件。 但是,这些文件位于“C:\ MyContentFiles \”位置,即它们不在项目锥体内。 这个目录也有子目录。 目录的内容不受pipe理。 因此,我必须包括所有的内容。

当我将它们作为“内容”包含在项目中时,它们被复制,但目录结构丢失。 我做了这样的事情:

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

如何将这些文件/目录recursion地复制到保存目录结构的项目的输出目录中?

您需要添加文件作为链接:

  1. 右键单击VS中的项目。
  2. 添加 – >现有项目…
  3. find文件。
  4. select它和。
  5. 添加为链接 (在对话框的添加button中下拉菜单)。
  6. 打开文件的属性并将“复制到输出目录”设置为“始终复制”。

但是你不能为目录树做。
相反,您需要为此编写后期构build任务。 这是一个会让你瞪大眼睛的样本 。

我相信@Dmytrii一方面是正确的 – 你想使用“链接”function。

但是,当你说不能链接到一个目录树时,他只是部分正确的。 当尝试使用Visual Studio的GUI添加链接时的确如此,MSBuild支持这一点。

如果要保留目录结构,只需将%(RecursiveDir)标记添加到<link>节点:

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

页面MSBuild知名项目元数据更详细地介绍了您可以访问的元数据。

Mandark的答案直接将内容文件添加到解决scheme中,并将在解决scheme资源pipe理器中显示。 无论何时在原始目录中添加或删除文件,Visual Studio都不会自动获取该文件。 此外,无论何时在解决scheme资源pipe理器中删除或添加文件,项目文件都会被更改,并且所有文件都是分开包含的,而不仅仅是包含该文件夹。

为了防止这种情况,你可以使用相同的技巧,但把它放在一个单独的项目文件,然后导入它。

项目文件(例如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不会混淆这个文件,只是在构build过程中添加文件作为内容。 始终包括原始目录中的更改。 这些文件不会显示在您的解决scheme资源pipe理器中,但会包含在输出目录中。

拿起这个技巧在这里: http : //blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

下面将添加到项目文件底部,将复制维护目标结构的内容文件到build目标目录$(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" /> 

我认为

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

只是够了,因为你想要在该文件夹和子文件夹中的一切