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

The*_*his 67 c# .net-core

所以我的问题非常简单.我有一些文件要复制到构建输出目录,无论是调试版本还是发布版本.我能找到的所有信息都是关于旧的json配置方法.任何人都有一个使用csproj与dotnetcore的例子?

Mar*_*ich 102

根据您的需求,有很多方法可以实现您的目标.

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

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

如果需要更多控制,最通用的方法是添加挂钩到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>
Run Code Online (Sandbox Code Playgroud)

这会将文件复制到相应的目录中.有关该<Copy>任务的更多选项,请参阅其文档.要将此限制为某些配置,您可以使用以下Condition属性:

<Target … Condition=" '$(Configuration)' == 'Release' ">
Run Code Online (Sandbox Code Playgroud)

Condition属性既可以应用于<Target>元素,也可以应用于任务元素<Copy>.


Mr *_*ose 53

虽然这有助于我对我的问题进行排序,但它并不适用于子目录中的所有文件.我也用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>
Run Code Online (Sandbox Code Playgroud)

  • 如果要包括中间子文件夹,请使用&lt;Content Include =“ layouts \ ** \ *。*”&gt; (5认同)
  • 所有其他答案/建议的其他所有排列都不适用于我.甚至没有提到详细构建输出中的文件.但你的建议在这里奏效了. (3认同)
  • 当使用Web SDK(`&lt;Project Sdk =“ Microsoft.NET.Sdk.Web”&gt;`)时,它将不允许您使用“ Include =`”,因为它似乎已经在SDK中隐式指定了它。我不得不使用`Update =`来构建它并包含我的其他文件。 (2认同)
  • 我找到了一个解决方案: ```xml &lt;Project Sdk="Microsoft.NET.Sdk"&gt; &lt;ItemGroup&gt; &lt;AssetsSourceFiles Include="assets/**/*.*"/&gt; &lt;/ItemGroup&gt; &lt;Target Name="CopyCustomContent " AfterTargets="AfterBuild"&gt; &lt;Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /&gt; &lt;/Target&gt; &lt;/Project&gt; ``` (请参阅我的答案以获得更好的效果代码格式。) (2认同)

Dom*_*nik 23

假设您assets的根目录中有一个文件夹。您可以随意命名。这只是一个例子:

你的项目.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>
Run Code Online (Sandbox Code Playgroud)

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

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <Content Include="assets\**\*.*">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,我错过了 asset\**\*.* ...用于指定深度的两个通配符。谢谢! (2认同)

Cha*_*ehn 14

将其放在.csproj文件中,用所需的文件路径替换nlog.config.然后只需保存它并构建您的项目:

<ItemGroup>
  <Content Update="Nlog.config">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)


iva*_*337 7

例如,您有名为test.txt的文件。要将“始终复制”设置为该文件,您需要将此部分添加到 .csproj 文件中:

<ItemGroup>
    <None Include="test.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)


hng*_*r18 5

我要求选择 HTML 模板在客户端和服务器端都可以使用(Handlebars js)

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

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

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

</Project>
Run Code Online (Sandbox Code Playgroud)


lle*_*lco 5

这会将完整目录复制到具有正确名称的子目录中。

<ItemGroup>
    <Content 
      Include="..\libs\x64\**\*.*"
      CopyToOutputDirectory="Always"
      TargetPath="x64\%(Filename)%(Extension)"
    />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)