我如何告诉编译器将 wwwroot 从一个项目复制到测试项目?

How can I tell compiler to copy wwwroot from one project to Tests proj?

假设我有这样的项目结构:

- 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>

但它并没有真正起作用

在您的 Tests.csproj 中,您可以为 wwwroot 文件夹设置一个 link:

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

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

正如@cyptus 建议的那样,您可以使用 MsBuild 任务。 例如,您可以添加任务,在每次构建后将 wwwroot 的内容复制到您想要的任何位置。为此,请在 Apprunner.csproj.

末尾添加 post 构建任务
 <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

上阅读有关复制任务的更多信息

另请记住,您可以在目标上设置条件,例如仅当您在发布中构建时才复制。