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.

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.


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.


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>

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>

-6

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

Przykład:

AsemblyInfo.cs 
AsemblyInfo.local.cs

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.