我有一个C#项目说MyProject.csproj位于“C:\ Projects \ MyProject \”。我也有我想复制到这个项目的输出目录中的文件。但是,文件位于“C:\ MyContentFiles \”位置,即它们不在项目锥内。该目录也有子目录。目录的内容不受管理。因此,我必须包括其下的所有内容。
当我在项目中将它们包含为“内容”时,它们会被复制,但目录结构会丢失。我做了这样的事情: -
<Content Include="..\..\MyContentFiles\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
如何将这些文件/目录递归复制到项目的输出目录中并保留目录结构?
答案 0 :(得分:130)
我相信@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 :(得分:42)
您需要添加文件作为链接:
但你不能为目录树做这件事 相反,你需要为此编写后期构建任务。 This is a sample会让你盯着看。
答案 2 :(得分:27)
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
答案 3 :(得分:9)
您将添加到项目文件底部的以下内容将您的内容文件复制到构建事件的目标目录$(TargetDirectory)
中(通常为{{1}) })。
$(MSBuildProjectDirectory)\bin\Debug
如果这些文件需要进入名为MyContentFiles的目录,您可以在复制前添加:
<ItemGroup>
<ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>
<Target Name="AfterBuild">
<Copy
SourceFiles="@(ExtraContent)"
DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />
</Target>
并更改
<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />
要
<Copy
SourceFiles="@(ExtraContent)"
DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />
答案 4 :(得分:3)
我认为
<Content Include="..\..\MyContentFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
这就够了,因为你想要那个文件夹和子文件夹中的所有东西
答案 5 :(得分:0)
要忽略.Net Core项目中的文件,
<ItemGroup>
<Content Include="appsettings.local.json">
<CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
答案 6 :(得分:0)
要将文件包含在.NET Core项目的文件夹中,
<ItemGroup>
<None Update="..\..\MyContentFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
并且项目的属性“复制到输出目录”将为“如果更新则复制”: