如何告诉编译器将wwwroot从一个项目复制到Tests proj?

时间:2019-10-01 13:58:33

标签: c# .net-core dotnet-cli

假设我有以下项目结构:

- AppRunner
        | - Apprunner.csproj
        | - wwwroot


- Tests  
        | - Tests.csproj
        | - bin
                | - debug
                        | - netcoreapp2.1
                                        | - I want copy wwwroot here

我想告诉编译器将wwwroot及其内部的所有项目和文件夹复制到output folder of tests

但是我希望它不仅可以在Windows上正常运行,而且在Linux上也可以正常运行

我将此添加到Tests.csproj:

<ItemGroup>
    <None Update="..\AppRunner\wwwroot\*">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>

但这并不能真正起作用

2 个答案:

答案 0 :(得分:4)

在您的Tests.csproj中,您可以建立一个指向wwwroot文件夹的链接:

<ItemGroup>
  <Content Include="..\AppRunner\wwwroot\**" Link="wwwroot\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="Always" />
</ItemGroup>

在Visual Studio中,这看起来像wwwroot项目中的常规Tests文件夹,但实际上它只是指向AppRunner中的文件夹的链接。当您指定CopyToOutputDirectory时,此文件夹及其内容将在构建Tests项目时复制到bin文件夹

答案 1 :(得分:0)

如@cyptus所建议,您可以利用MsBuild任务。 例如,您可以添加任务,以便在每次构建后将wwwroot的内容复制到任何位置。为此,请在 Apprunner.csproj 的末尾添加构建后任务。

 <Target Name="CopyWwwroot" AfterTargets="Build">
   <ItemGroup>
        <CopyItems Include="$(SolutionDir)\Apprunner\wwwroot\**\*.*" />
  </ItemGroup>
     <Copy 
      SourceFiles="@(CopyItems)" 
      DestinationFolder="..\Tests\bin\$(Configuration)\$(TargetFramework)\wwwroot\%(RecursiveDir)" 
      SkipUnchangedFiles="false"
      OverwriteReadOnlyFiles="true" 
      Retries="3"
      RetryDelayMilliseconds="300"/>
</Target>

$(Configuration)是当前配置,例如调试或发布

$(TargetFramework)是您在场景netcoreapp2.1中构建的框架

如果您真的希望,可以对这些值进行硬编码。您可以在文档https://docs.microsoft.com/en-us/visualstudio/msbuild/copy-task?view=vs-2019

上了解有关复制任务的更多信息

还请记住,您可以在目标上设置条件,例如仅在发行版中进行复制。