使用 csproj dotnetcore 将文件复制到输出目录

所以我的问题很简单。无论是调试版本还是发布版本,我都希望将一些文件复制到生成输出目录。我能找到的所有信息都是关于旧的 json 配置方法的。有人有一个例子使用的 csproj 与 dotnetcore?

139357 次浏览

有很多方法可以实现你的目标,这取决于你的需求是什么。

最简单的方法是有条件地设置元数据(CopyToOutputDirectory/CopyToPublishDirectory)项(假设 .txtNone而不是 Content,如果不起作用,试试 <Content>) :

<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

如果需要更多的控制,那么最通用的方法是在 csproj 文件中添加能够挂钩到构建过程的自定义目标:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
<Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>

这会将一个文件复制到相应的目录。有关 <Copy>任务的更多选项,请参见 文件。为了将其限制在某些配置中,可以使用 Condition属性:

<Target … Condition=" '$(Configuration)' == 'Release' ">

这个 Condition属性既可以应用于 <Target>元素,也可以应用于诸如 <Copy>之类的任务元素。

把这个放进你的。Csproj 文件,用所需的文件路径替换 nlog.config。然后简单地保存它并构建您的项目:

<ItemGroup>
<Content Update="Nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

虽然这帮助我解决了问题,但是它并不适用于子目录中的所有文件。我还使用了 Content Include而不是 Content Update

<Project Sdk="Microsoft.NET.Sdk">


<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>


<ItemGroup>
<Content Include="layouts\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>


</Project>

我需要选择一些 HTML 模板,使其既可以在客户端使用,也可以在服务器端使用(Handlebarsjs)

<Project Sdk="Microsoft.NET.Sdk.Web">


<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>


<ItemGroup>
<Content Update="wwwroot\html-templates\**\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>


</Project>

如果你需要强制复制一个特定的 NuGet 包到 ASP.NET 核心项目(2.2)中,在 csproj 的末尾添加:

<!-- Force copy MathNet because we need it in compilation -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" />
</Target>


<ItemGroup>
<ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>MathNet.Numerics.dll</TargetPath>
</ContentWithTargetPath>
</ItemGroup>
<PropertyGroup>
<PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent>
</PropertyGroup>

或者

<PropertyGroup>
<PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent>
</PropertyGroup>

假设您的根目录中有一个 assets文件夹。你想怎么命名都行。这只是一个例子:

Your-project. csproj

<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<AssetsSourceFiles Include="assets/**/*.*"/>
</ItemGroup>


<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>
</Project>

这只将 assets文件夹的内容复制到输出根目录,而不将其封装到 assets文件夹中。但是如果你想复制文件夹本身,你可以使用下面的代码:

<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<Content Include="assets\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

例如,您有一个名为 Test.txt的文件。要将 收到设置为此文件,需要将此节添加到。Csproj 文件:

<ItemGroup>
<None Include="test.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>