Können Dateien in VS2017 Solution Explorer für .NET Core-Projekte (Nicht-ASP.NET Core) verschachtelt werden?

85

In "alten" MSBuild-Projekten - wie sie beispielsweise von Windows Forms in VS2017 noch verwendet werden - können Dateien über ein DependentUponElement in der csproj-Datei "verschachtelt" werden .

Ich habe dies verwendet, um Unit-Tests in Noda Time zu gruppieren, z

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

Das führte zu leicht navigierbaren Tests:

Verschachtelte Tests

Ich habe diese Funktion wissentlich "verloren", als ich zu project.json.NET Core gewechselt bin , hatte aber gehofft, dass sie bei der Konvertierung in MSBuild zurückkehren würde. Es sieht jedoch so aus, als würden MSBuild-Projekte, die auf dem .NET Core SDK (Root-Element <Project Sdk="Microsoft.NET.Sdk">) basieren, in Visual Studio 2017 nicht die gleiche Behandlung erhalten, selbst wenn ein ItemGroupProjekt manuell mit denselben Elementen wie das "Old School" -Projekt hinzugefügt wird.

ASP.NET Core-Projekte erhalten eine automatische Verschachtelung für minimiertes CSS und Javascript. Es ist jedoch nicht klar, wie dies auf C # in .NET Core-Bibliotheksprojekten angewendet werden soll.

Jon Skeet
quelle

Antworten:

104

Ich habe es in einem meiner Microsoft.NET.SdkProjekte im Stil mit etwas ähnlichem wie dem folgenden:

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

Der Trick hier ist, Updatestatt zu verwenden Include. Dies liegt daran, dass die impliziten Elemente aus einer Requisitendatei stammen, die vor dem Hauptprojekt importiert wurde. Eine zusätzliche IncludeOption wirkt sich nicht auf bereits enthaltene Dateien aus, kann jedoch mithilfe von geändert werden Update.

Matthew King
quelle
2
Okay, das ist bizarr - ich bin sicher, ich habe das versucht und es hat nicht funktioniert. Es ist jetzt. Sehr, sehr bizarr. Ah - es ist eher das "Update" als "Include".
Jon Skeet
1
Ich muss zugeben, dass ich nicht genau weiß, warum das Include vs Update den Unterschied macht. Würde es lieben, wenn einer der Werkzeugleute zusätzliche Informationen liefert.
Matthew King
1
@MatthewKing: Ich vermute, dass dies daran liegt, dass es *.csstandardmäßig bereits enthalten ist und der Inhalt verschachtelter Elemente daher ignoriert wird.
Jon Skeet
1
@ JonSkeet, ja ... wie du gesagt hast, es ist bizarr ... Ich habe es noch einmal in einem anderen Projekt versucht und es hat funktioniert. Ich möchte Tests hinter Klassen verschachteln , die sie testen , aber es wäre verrückt, dies für Hunderte von Dateien manuell zu tun ... Selbst wenn ich eine Erweiterung dafür schreibe - die Projektdatei sieht nicht gut aus. Also habe ich mich endlich entschlossen, immer Microsoft.NET.Sdk.Webauch für Klassenbibliotheken zu verwenden. Jetzt muss ich die Verschachtelung überhaupt nicht mehr konfigurieren.
Pavel Agarkov
1
Ich habe dies gerade getestet und Sie müssen denselben BuildAction-Namen verwenden, z. B. 'Kompilieren' durch 'Inhalt' oder 'Keine' ersetzen, basierend auf Ihren Dateieigenschaften. In meinem Fall war es 'Content'
SM3RKY
10

In Visual Studio 2019 habe ich ein .NET Core 2.2- <Project Sdk="Microsoft.NET.Sdk">Projekt, in dem ich die schön verschachtelten Dateien appsettings.json / appsettings.Development.json haben wollte, genau wie sie es automatisch für <Project Sdk="Microsoft.NET.Sdk.Web">Projekte tun .

Folgendes musste ich dem .CSPROJ hinzufügen:

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

Danach musste ich das Projekt entladen / neu laden, damit die Änderung im Projektmappen-Explorer wirksam wurde. Beachten Sie, dass ich diese Dateien auch so eingestellt habe, dass sie immer in das Ausgabeverzeichnis kopiert werden.

David McClelland
quelle
6

Wenn Sie einen Platzhalter verwenden möchten, anstatt jeden Eintrag von Hand zu erstellen , bedeutet das Hinzufügen dieser Zeilen zu Ihrer .csproj- Datei, dass alles wie Foo.tests.cs automatisch unter Foo.cs verschachtelt wird

Getestet und in VS2019 mit .NET Core 3.1.0

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

Wenn Sie mit .netstandardx.x können Sie nicht verwenden NestedIn . Es funktioniert nicht.

Sie können dies manuell in Ihrer .csproj tun

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

Wenn Sie dasselbe Präfix verwenden, werden Dateien automatisch verschachtelt.

Beispiel:

AsemblyInfo.cs 
AsemblyInfo.local.cs
Miguel Domingues
quelle
1
Die Frage betraf .NET Core. Können Sie Ihre Zweifel klären?
Miguel Domingues
2
Haben Sie es in VS2017 versucht? Ich habe gerade eine offene Lösung mit .NetFramework 4.7.1, Core 2.0 und Standard 2.1. Ich habe versucht, in einem Projekt jedes Typs eine Class.cs und dann eine Class.local.cs hinzuzufügen. Keine automatische Verschachtelung. Die manuelle Verschachtelung funktioniert einwandfrei. VS2017 (15.7.4)
Andrew Steitz
Visual Studio 2017 15.9.3: Dateien mit demselben Präfix werden automatisch im
Projektmappen-