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


103

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

Answers:


143

有多种方法可以实现目标,具体取决于您的需求。

最简单的方法是有条件地设置元数据(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>


我如何将'DestinationFolder'应用于<Reference>项目,或者是否有可能,我找不到的文档太多。我不希望我的所有程序集都在根级别,并且希望它们位于自己的文件夹中。
Reahreic

您可以直接DestinationSubDirectory="subdir\"Reference项目上设置元数据。但是,这意味着您需要自己实现程序集解析(AssemblyResolve事件
Martin Ullrich

如何复制在各个文件夹中包含某些dll的父文件夹。我想让它们在输出发布的路径中可用,以便在构建这些文件夹后,在运行时可用于我的应用程序,因为在启动时我将这些dll作为插件加载。我在Mac上使用rider
kuldeep

93

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

3
所有其他答案/建议的所有其他排列对我都无效。甚至没有在详细的生成输出中提及该文件。但是您的建议在这里有效。
user7817808

15
如果要包括中间子文件夹,请使用<Content Include="layouts\**\*.*">
-JSancho

3
使用Web SDK(<Project Sdk="Microsoft.NET.Sdk.Web">)时,您将无法使用Include=它,因为它似乎已经在SDK中隐式指定了它。我必须使用Update=它来构建并包含其他文件。
notracs

很好,谢谢。但是如何只将文件夹的内容复制到输出目录,而不是文件夹本身。该表达式assets\*.*应假定它。但是它将复制完整的资产文件夹。所以我有bin/Debug/netcoreapp3.1/assets/...但是我想要资产文件夹的文件到输出的根目录。bin/Debug/netcoreapp3.1/...
多米尼克

我找到了一个解决方案:(xml <Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AssetsSourceFiles Include="assets/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContent" AfterTargets="AfterBuild"> <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /> </Target> </Project> 请参阅我的答案以获取更好的代码格式。)
Dominik

15

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

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

这似乎不会复制子目录。
无效

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

我要求选择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>

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>

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>

1
理想情况下,使用<Copy>任务使其跨平台。
Bruno Garcia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.