Czy pliki można zagnieżdżać w programie VS2017 Solution Explorer dla projektów .NET Core (innych niż ASP.NET Core)?

85

W projektach MSBuild „starej szkoły” - nadal używanych na przykład przez Windows Forms w VS2017 - pliki mogą być „zagnieżdżane” za pośrednictwem DependentUponelementu w pliku csproj.

Użyłem tego do grupowania testów jednostkowych w czasie Noda, np

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

Doprowadziło to do łatwych w nawigacji testów:

Testy zagnieżdżone

Świadomie „straciłem” tę funkcję podczas przechodzenia project.jsonna .NET Core, ale miałem nadzieję, że powróci ona podczas konwersji do MSBuild. Wygląda jednak na to, że projekty MSBuild oparte na .NET Core SDK (element główny <Project Sdk="Microsoft.NET.Sdk">) nie są traktowane w ten sam sposób w programie Visual Studio 2017, nawet jeśli ItemGroupsą dodawane ręcznie z tymi samymi elementami, co projekt „starej szkoły”.

Projekty ASP.NET Core otrzymują automatyczne zagnieżdżanie dla zminimalizowanych CSS i JavaScript, ale nie jest jasne, jak zastosować to do języka C # w projektach bibliotek .NET Core.

Jon Skeet
źródło

Odpowiedzi:

104

Mam go w jednym z Microsoft.NET.Sdkprojektów w moim stylu, używając czegoś podobnego do następującego:

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

Sztuczka polega na tym, aby użyć Updatezamiast Include. Dzieje się tak, ponieważ ukryte elementy pochodzą z pliku właściwości, który jest importowany przed głównym projektem. Dodatkowy Includenie wpłynie na pliki, które są już uwzględnione, ale można je zmodyfikować za pomocą Update.

Matthew King
źródło
2
Okay, to dziwne - jestem pewien, że próbowałem tego i nie działało. Teraz jest. Bardzo, bardzo dziwaczne. Ach - to raczej „Aktualizacja” niż „Uwzględnij”.
Jon Skeet
1
Muszę przyznać, że nie jestem do końca pewien, dlaczego Include vs Update robi różnicę. Chciałbym, żeby jeden z fachowców udzielił dodatkowych informacji.
Matthew King
1
@MatthewKing: Domyślam się, że dzieje się tak, ponieważ *.csjest już domyślnie uwzględniona, a zatem zawartość zagnieżdżonego elementu jest ignorowana.
Jon Skeet
1
@JonSkeet, tak ... jak powiedziałeś, to dziwne ... Próbowałem tego jeszcze raz w innym projekcie i zadziałało. Chcę zagnieżdżać testy za testowanymi przez siebie klasami , ale byłoby szalone robić to ręcznie dla setek plików ... Nawet jeśli napiszę do tego rozszerzenie - plik projektu nie będzie dobrze wyglądał. Więc w końcu zdecydowałem się zawsze używać Microsoft.NET.Sdk.Webnawet dla bibliotek klas. Teraz w ogóle nie muszę konfigurować zagnieżdżania.
Pavel Agarkov
1
Właśnie to przetestowałem i musisz użyć tej samej nazwy BuildAction, np. Zamienić „Kompiluj” na „Zawartość” lub „Brak” w zależności od właściwości pliku. W moim przypadku była to „Treść”
SM3RKY
10

W programie Visual Studio 2019 mam projekt .NET Core 2.2 <Project Sdk="Microsoft.NET.Sdk">, w którym chciałem mieć ładnie zagnieżdżone pliki appsettings.json / appsettings.Development.json, tak jak robią to automatycznie dla <Project Sdk="Microsoft.NET.Sdk.Web">projektów.

Oto, co musiałem dodać do .CSPROJ:

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

Następnie musiałem zwolnić / ponownie załadować projekt, aby zmiana została uwzględniona w Eksploratorze rozwiązań. Zauważ, że ustawiłem również te pliki tak, aby zawsze były kopiowane do katalogu wyjściowego.

David McClelland
źródło
6

Jeśli chcesz użyć symboli wieloznacznych zamiast ręcznie tworzyć każdy wpis, dodanie tych wierszy do pliku .csproj oznacza, że ​​wszystko, jak Foo.tests.cs, zostanie automatycznie zagnieżdżone w Foo.cs

Przetestowane i działające w VS2019 z .NET Core 3.1.0

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

Jeśli używasz .netstandardx.x , nie możesz używać NestedIn . To nie działa.

Możesz to zrobić ręcznie w pliku .csproj

<ItemGroup><Compile Include="BaseClass">ChildClass.cs</Compile></ItemGroup>
Batuhan
źródło
-6

Jeśli użyjesz tego samego prefiksu, pliki zostaną zagnieżdżone automatycznie.

Przykład:

AsemblyInfo.cs 
AsemblyInfo.local.cs
Miguel Domingues
źródło
1
Pytanie dotyczyło platformy .NET Core. Czy możesz wyjaśnić swoje wątpliwości?
Miguel Domingues
2
Czy próbowałeś tego w VS2017? Mam otwarte rozwiązanie, które ma .NetFramework 4.7.1, Core 2.0 i Standard 2.1. Próbowałem dodać Class.cs, a następnie Class.local.cs w projekcie każdego typu. Brak automatycznego zagnieżdżania. Zagnieżdżanie ręczne działa dobrze. VS2017 (15.7.4)
Andrew Steitz
Visual Studio 2017 15.9.3: Pliki z tym samym prefiksem są automatycznie zagnieżdżane w Eksploratorze rozwiązań
brsfan