I file possono essere nidificati in VS2017 Solution Explorer per progetti .NET Core (non ASP.NET Core)?


86

Nei progetti MSBuild "vecchia scuola", come ancora utilizzati da Windows Form in VS2017, ad esempio, i file potevano essere "annidati" tramite un DependentUponelemento nel file csproj.

L'ho usato per raggruppare unit test insieme in Noda Time, ad es

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

Ciò ha portato a test facilmente navigabili:

Test annidati

Ho consapevolmente "perso" questa funzionalità quando sono passato a project.json.NET Core, ma speravo che sarebbe tornata durante la conversione in MSBuild. Tuttavia, sembra che i progetti MSBuild basati su .NET Core SDK (elemento radice <Project Sdk="Microsoft.NET.Sdk">) non ottengano lo stesso trattamento in Visual Studio 2017, anche se ItemGroupviene aggiunto manualmente con gli stessi elementi del progetto "vecchia scuola".

I progetti ASP.NET Core ricevono l'annidamento automatico per CSS e Javascript minimizzati, ma non è chiaro come applicarlo a C # nei progetti di libreria .NET Core.

Risposte:


106

L'ho funzionato in uno dei miei Microsoft.NET.Sdkprogetti in stile utilizzando qualcosa di simile al seguente:

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

Il trucco qui è usare Updateinvece di Include. Questo perché gli elementi impliciti provengono da un file props importato prima del progetto principale. Un ulteriore Includenon influirà sui file che sono già inclusi, ma possono essere modificati utilizzando Update.


2
Ok, è bizzarro - sono sicuro di averlo provato e non ha funzionato. Adesso lo è. Molto, molto bizzarro. Ah, è l '"Aggiorna" piuttosto che "Includi".
Jon Skeet

1
Devo ammettere che non sono esattamente sicuro del motivo per cui Include vs Update fa la differenza. Mi piacerebbe che uno degli addetti agli strumenti fornisse alcune informazioni aggiuntive.
Matthew King,

2
@ MatthewKing: La mia ipotesi è che sia perché *.csè già incluso per impostazione predefinita e che il contenuto dell'elemento nidificato viene quindi ignorato.
Jon Skeet

1
@ JonSkeet, sì ... come hai detto è bizzarro ... l'ho provato ancora una volta in un altro progetto e ha funzionato. Voglio annidare i test dietro le classi che testano , ma sarebbe folle farlo manualmente per centinaia di file ... Anche se scrivo un'estensione per questo, il file di progetto non avrà un bell'aspetto. Così ho finalmente deciso di usarlo sempre Microsoft.NET.Sdk.Webanche per le librerie di classi. Ora non devo configurare affatto l'annidamento.
Pavel Agarkov

1
L'ho appena testato ed è necessario utilizzare lo stesso nome BuildAction, ad esempio sostituire "Compile" con "Content" o "None" in base alle proprietà del file. Nel mio caso era "Content"
SM3RKY

11

In Visual Studio 2019, ho un <Project Sdk="Microsoft.NET.Sdk">progetto .NET Core 2.2 in cui volevo i file appsettings.json / appsettings.Development.json ben annidati, proprio come fanno automaticamente per i <Project Sdk="Microsoft.NET.Sdk.Web">progetti.

Ecco cosa ho dovuto aggiungere a .CSPROJ:

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

Successivamente, ho dovuto scaricare / ricaricare il progetto affinché la modifica avesse effetto in Esplora soluzioni. Nota che ho anche impostato questi file per essere sempre copiati nella directory di output.


6

Se vuoi inserire un carattere jolly invece di creare a mano ogni voce, aggiungere queste righe al tuo file .csproj significa che qualsiasi cosa come Foo.tests.cs viene automaticamente annidata sotto Foo.cs

Testato e funzionante in VS2019 con .NET Core 3.1.0

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

2

Se utilizzi .netstandardx.x non puoi utilizzare NestedIn . La sua non funziona.

Puoi farlo manualmente nel tuo file .csproj

<ItemGroup><Compile Include="BaseClass">ChildClass.cs</Compile></ItemGroup>

-6

Se utilizzi lo stesso prefisso, i file verranno nidificati automaticamente.

Esempio:

AsemblyInfo.cs 
AsemblyInfo.local.cs

1
La domanda riguardava .NET Core. Puoi chiarire il tuo dubbio?
Miguel Domingues

2
L'hai provato in VS2017? In questo momento ho una soluzione aperta con .NetFramework 4.7.1, Core 2.0 e Standard 2.1. Ho provato ad aggiungere un Class.cs e poi un Class.local.cs in un progetto di ogni tipo. Nessun annidamento automatico. L'annidamento manuale funziona bene. VS2017 (15.7.4)
Andrew Steitz

Visual Studio 2017 15.9.3: i file con lo stesso prefisso vengono automaticamente nidificati in Esplora soluzioni
brsfan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.