Чи можна вкладати файли у VS2017 Solution Explorer для проектів .NET Core (не-ASP.NET Core)?


85

У "старих" проектах 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.

Відповіді:


104

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

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

Фокус тут полягає у використанні Updateзамість Include. Це пов’язано з тим, що неявні елементи надходять із файлу реквізиту, який імпортується до основного проекту. Додатковий Includeне вплине на файли, які вже включені, але їх можна змінити за допомогою Update.


2
Добре, це дивно - я впевнений, що спробував це, і це не спрацювало. Це зараз. Дуже, дуже химерно. Ах - це "Оновлення", а не "Включити".
Джон Скіт,

1
Я повинен визнати, що я не зовсім впевнений, чому Включити проти Оновлення має значення. Хотілося б, щоб хтось із інструментів надав додаткову інформацію.
Метью Кінг

1
@MatthewKing: Я думаю , це тому, що *.csце вже включено за замовчуванням, і тому вміст вкладеного елемента ігнорується.
Джон Скіт,

1
@JonSkeet, так ... як ви сказали, це дивно ... Я ще раз спробував це в іншому проекті, і це спрацювало. Я хочу вкласти тести за класами, які вони тестують , але було б божевільно робити це для сотень файлів вручну ... Навіть якщо я напишу розширення для цього - файл проекту не буде виглядати добре. Тож я нарешті вирішив завжди використовувати Microsoft.NET.Sdk.Webнавіть для бібліотек класів. Тепер мені взагалі не потрібно налаштовувати вкладеність.
Павло Агарков

1
Я щойно перевірив це, і вам потрібно використовувати одне і те ж ім'я BuildAction, наприклад, замінити "Compile" на "Content" або "None" на основі властивостей вашого файлу. У моєму випадку це був "Вміст"
SM3RKY

10

У 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: Файли з тим самим префіксом автоматично
вкладаються
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.