Os arquivos podem ser aninhados em projetos do VS2017 Solution Explorer para .NET Core (não-ASP.NET Core)?

86

Em projetos MSBuild da "velha escola" - como ainda usado pelo Windows Forms no VS2017, por exemplo - os arquivos podem ser "aninhados" por meio de um DependentUponitem no arquivo csproj.

Usei isso para agrupar testes de unidade no Horário de Noda, por exemplo

<Compile Include="LocalDateTest.PeriodArithmetic.cs">
  <DependentUpon>LocalDateTest.cs</DependentUpon>
</Compile>

Isso levou a testes de fácil navegação:

Testes aninhados

Eu conscientemente "perdi" esse recurso ao mudar project.jsonpara o .NET Core, mas esperava que ele retornasse ao converter para o MSBuild. No entanto, parece que os projetos MSBuild baseados no .NET Core SDK (elemento raiz <Project Sdk="Microsoft.NET.Sdk">) não recebem o mesmo tratamento no Visual Studio 2017, mesmo se umItemGroup for adicionado manualmente com os mesmos elementos do projeto "old school".

Projetos ASP.NET Core recebem aninhamento automático para CSS e Javascript minimizados, mas não está claro como aplicar isso ao C # em projetos de biblioteca do .NET Core.

Jon Skeet
fonte

Respostas:

106

Eu o tenho funcionando em um dos meus Microsoft.NET.Sdkprojetos de estilo, usando algo semelhante ao seguinte:

<ItemGroup>
  <Compile Update="LocalDateTest.*.cs">
    <DependentUpon>LocalDateTest.cs</DependentUpon>
  </Compile>
</ItemGroup>

O truque aqui é usar em Updatevez de Include. Isso ocorre porque os itens implícitos vêm de um arquivo props que é importado antes do projeto principal. Um adicional Includenão afetará os arquivos que já estão incluídos, mas podem ser modificados usando Update.

Matthew King
fonte
2
Ok, isso é bizarro - tenho certeza de que tentei isso e não estava funcionando. Agora é. Muito, muito bizarro. Ah - é "Atualizar" em vez de "Incluir".
Jon Skeet
1
Devo admitir que não sei exatamente por que Incluir vs Atualizar faz a diferença. Adoraria que um dos profissionais de ferramentas fornecesse algumas informações adicionais.
Matthew King
2
@MatthewKing: Meu palpite é que é porque *.csjá está incluído por padrão e que o conteúdo do elemento aninhado é, portanto, ignorado.
Jon Skeet
1
@JonSkeet, sim ... como você disse é bizarro ... tentei mais uma vez em outro projeto e funcionou. Eu quero aninhar testes atrás de classes que eles testam , mas seria uma loucura fazer isso para centenas de arquivos manualmente ... Mesmo se eu escrever uma extensão para isso - o arquivo de projeto não ficará bem. Então, finalmente decidi usar sempre Microsoft.NET.Sdk.Webaté mesmo para bibliotecas de classe. Agora não preciso configurar o aninhamento.
Pavel Agarkov
1
Acabei de testar isso e você precisa usar o mesmo nome BuildAction, por exemplo, substitua 'Compilar' por 'Conteúdo' ou 'Nenhum' com base nas propriedades do arquivo. No meu caso, era 'Conteúdo'
SM3RKY
11

No Visual Studio 2019, tenho um <Project Sdk="Microsoft.NET.Sdk">projeto .NET Core 2.2 no qual queria os arquivos appsettings.json / appsettings.Development.json bem aninhados, assim como eles fazem automaticamente para <Project Sdk="Microsoft.NET.Sdk.Web">projetos.

Aqui está o que eu precisava adicionar ao .CSPROJ:

  <ItemGroup>
    <Content Include="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="appsettings.Development.json">
      <DependentUpon>appsettings.json</DependentUpon>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

Depois disso, tive que descarregar / recarregar o projeto para que a alteração tivesse efeito no Solution Explorer. Observe que também defini esses arquivos para sempre serem copiados para o diretório de saída.

David McClelland
fonte
6

Se você quiser curinga em vez de mão-elaboração de cada entrada, adicionando estas linhas ao seu .csproj meio de arquivos que qualquer coisa como Foo.tests.cs obtém automagicamente sob aninhada Foo.cs

Testado e funcionando em VS2019 com .NET Core 3.1.0

  <ItemGroup>
    <Compile Update="**\*.tests.cs">
      <DependentUpon>$([System.String]::Copy(%(Filename)).Replace(".tests",".cs"))</DependentUpon>
    </Compile>
  </ItemGroup>
Jinlye
fonte
2

Se você estiver usando .netstandardx.x, você não pode usar NestedIn . Não está funcionando.

Você pode fazer isso manualmente em seu .csproj

<ItemGroup><Compile Include="BaseClass">ChildClass.cs</Compile></ItemGroup>
Batuhan
fonte
-6

Se você usar o mesmo prefixo, ele aninhará os arquivos automaticamente.

Exemplo:

AsemblyInfo.cs 
AsemblyInfo.local.cs
Miguel Domingues
fonte
1
A pergunta era sobre o .NET Core. Você pode esclarecer sua dúvida?
Miguel Domingues
2
Você já experimentou no VS2017? Tenho uma solução aberta agora que tem .NetFramework 4.7.1, Core 2.0 e Standard 2.1. Tentei adicionar Class.cs e Class.local.cs em um projeto de cada tipo. Sem aninhamento automático. O aninhamento manual funciona bem. VS2017 (15.7.4)
Andrew Steitz
Visual Studio 2017 15.9.3: Arquivos com o mesmo prefixo estão sendo aninhados automaticamente no Solution Explorer
brsfan