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

时间:2017-06-05 17:07:42

标签: c# .net-core

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

7 个答案:

答案 0 :(得分:81)

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

最简单的方法是有条件地设置元数据(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>任务的更多选项,请参阅its documentation。要将此限制为某些配置,您可以使用Condition属性:

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

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

答案 1 :(得分:28)

这虽然可以帮助我解决问题,但不适用于子目录中的所有文件。我还使用了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>

答案 2 :(得分:13)

假设您的根目录中有一个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>

答案 3 :(得分:11)

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

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

答案 4 :(得分:0)

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

json_encode($order->getAttributes())

答案 5 :(得分:0)

感谢您的辛苦,如果您需要将特定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>

答案 6 :(得分:0)

<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>
相关问题