Могут ли файлы быть вложенными в обозреватель решений VS2017 для проектов .NET Core (не ASP.NET Core)?

86

В проектах MSBuild «старой школы», которые до сих пор используются Windows Forms в VS2017, например, файлы могут быть «вложены» через DependentUponэлемент в файле csproj.

Я использовал это для группировки модульных тестов в Noda Time, например

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

Это привело к легко управляемым тестам:

Вложенные тесты

Я сознательно «потерял» эту функцию при переходе project.jsonна .NET Core, но надеялся, что она вернется при преобразовании в MSBuild. Однако похоже, что проекты MSBuild, основанные на .NET Core SDK (корневой элемент <Project Sdk="Microsoft.NET.Sdk">), не получают такой же обработки в Visual Studio 2017, даже если они ItemGroupдобавляются вручную с теми же элементами, что и проект «старой школы».

Проекты ASP.NET Core получают автоматическое вложение для миниатюрных CSS и Javascript, но неясно, как применить это к C # в проектах библиотеки .NET Core.

Джон Скит
источник

Ответы:

106

У меня он работает в одном из моих Microsoft.NET.Sdkпроектов в стиле, используя что-то вроде следующего:

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

Уловка здесь в том, чтобы использовать Updateвместо Include. Это связано с тем, что неявные элементы поступают из файла реквизита, который импортируется перед основным проектом. Дополнительный Includeне повлияет на файлы, которые уже включены, но их можно изменить с помощью Update.

Мэтью Кинг
источник
2
Ладно, это странно - я уверен, что пробовал, и это не сработало. Сейчас это так. Очень-очень странно. Ах, это скорее «Обновить», чем «Включить».
Джон Скит
1
Я должен признать, что не совсем уверен, почему Include vs Update имеет значение. Хотелось бы, чтобы один из специалистов по инструментам предоставил дополнительную информацию.
Мэтью Кинг,
2
@MatthewKing: Я предполагаю , что это потому, что *.csон уже включен по умолчанию, и поэтому содержимое вложенных элементов игнорируется.
Джон Скит
1
@JonSkeet, да ... как вы сказали, это странно ... Я попробовал еще раз в другом проекте, и это сработало. Я действительно хочу вложить тесты в классы, которые они тестируют , но было бы безумием делать это для сотен файлов вручную ... Даже если я напишу для этого расширение - файл проекта не будет хорошо выглядеть. Поэтому я, наконец, решил всегда использовать Microsoft.NET.Sdk.Webдаже для библиотек классов. Теперь мне вообще не нужно настраивать вложение.
Павел Агарков
1
Я только что протестировал это, и вам нужно использовать то же имя BuildAction, например, заменить «Compile» на «Content» или «None» в зависимости от свойств файла. В моем случае это было «Контент»
SM3RKY
11

В Visual Studio 2019 у меня есть проект .NET Core 2.2, <Project Sdk="Microsoft.NET.Sdk">в котором мне нужны красиво вложенные файлы appsettings.json / appsettings.Development.json, точно так же, как они это делают автоматически для <Project Sdk="Microsoft.NET.Sdk.Web">проектов.

Вот что мне пришлось добавить в .CSPROJ:

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

После этого мне пришлось выгрузить / перезагрузить проект, чтобы изменения вступили в силу в обозревателе решений. Обратите внимание, что я также установил, что эти файлы всегда копируются в выходной каталог.

Дэвид Макклелланд
источник
6

Если вы хотите использовать подстановочные знаки вместо того, чтобы вручную создавать каждую запись, добавление этих строк в ваш файл .csproj означает, что что-нибудь вроде Foo.tests.cs автоматически будет вложено в Foo.cs

Протестировано и работает в VS2019 с .NET Core 3.1.0

  <ItemGroup>
    <Compile Update="**\*.tests.cs">
      <DependentUpon>$([System.String]::Copy(%(Filename)).Replace(".tests",".cs"))</DependentUpon>
    </Compile>
  </ItemGroup>
Джинли
источник
2

Если вы используете .netstandardx.x, вы не можете использовать NestedIn . Это не работает.

Вы можете сделать это вручную в своем .csproj

<ItemGroup><Compile Include="BaseClass">ChildClass.cs</Compile></ItemGroup>
Батухан
источник
-6

Если вы используете тот же префикс, он автоматически вложит файлы.

Пример:

AsemblyInfo.cs 
AsemblyInfo.local.cs
Мигель Домингес
источник
1
Вопрос был о .NET Core. Вы можете прояснить свои сомнения?
Мигель Домингес
2
Вы пробовали это в VS2017? У меня сейчас открыто решение, в котором есть .NetFramework 4.7.1, Core 2.0 и Standard 2.1. Я попытался добавить Class.cs, а затем Class.local.cs в проект каждого типа. Нет автоматического вложения. Вложение вручную работает нормально. VS2017 (15.7.4)
Эндрю
Visual Studio 2017 15.9.3: файлы с одинаковым префиксом автоматически вкладываются в обозреватель решений
brsfan,