¿Se pueden anidar los archivos en el Explorador de soluciones VS2017 para proyectos .NET Core (que no son ASP.NET Core)?

85

En los proyectos de MSBuild de la "vieja escuela", como todavía lo usan Windows Forms en VS2017, por ejemplo, los archivos se pueden "anidar" a través de un DependentUponelemento en el archivo csproj.

Usé esto para agrupar las pruebas unitarias en Noda Time, por ejemplo

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

Eso llevó a pruebas de fácil navegación:

Pruebas anidadas

"Perdí" a sabiendas esta característica al pasar a project.json.NET Core, pero esperaba que volviera al convertir a MSBuild. Sin embargo, parece que los proyectos de MSBuild basados ​​en .NET Core SDK (elemento raíz <Project Sdk="Microsoft.NET.Sdk">) no reciben el mismo tratamiento en Visual Studio 2017, incluso si ItemGroupse agrega manualmente con los mismos elementos que el proyecto de la "vieja escuela".

Los proyectos ASP.NET Core reciben anidación automática para CSS y Javascript minificados, pero no está claro cómo aplicar eso a C # en proyectos de biblioteca .NET Core.

Jon Skeet
fuente

Respuestas:

104

Lo tengo funcionando en uno de mis Microsoft.NET.Sdkproyectos de estilo usando algo similar a lo siguiente:

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

El truco aquí es usar en Updatelugar de Include. Esto se debe a que los elementos implícitos provienen de un archivo de accesorios que se importa antes del proyecto principal. Un adicional Includeno afectará a los archivos que ya están incluidos, pero se pueden modificar usando Update.

Matthew King
fuente
2
Bien, esto es extraño, estoy seguro de que lo intenté y no funcionó. Ahora lo es. Muy, muy extraño. Ah, es la "Actualización" en lugar de "Incluir".
Jon Skeet
1
Debo admitir que no estoy exactamente seguro de por qué Incluir vs Actualizar marca la diferencia. Me encantaría que una de las personas que trabaja con herramientas nos proporcione información adicional.
Matthew King
1
@MatthewKing: Supongo que se debe a *.csque ya está incluido de forma predeterminada y, por lo tanto, se ignora el contenido del elemento anidado.
Jon Skeet
1
@JonSkeet, sí ... como dijiste, es extraño ... Lo intenté una vez más en otro proyecto y funcionó. Quiero anidar las pruebas detrás de las clases que prueban , pero sería una locura hacerlo para cientos de archivos manualmente ... Incluso si escribo una extensión para esto, el archivo del proyecto no se verá bien. Así que finalmente decidí usar siempre Microsoft.NET.Sdk.Webincluso para bibliotecas de clases. Ahora no tengo que configurar el anidamiento en absoluto.
Pavel Agarkov
1
Acabo de probar esto y debe usar el mismo nombre de BuildAction, por ejemplo, reemplace 'Compilar' con 'Contenido' o 'Ninguno' según las propiedades de su archivo. En mi caso fue 'Contenido'
SM3RKY
10

En Visual Studio 2019, tengo un <Project Sdk="Microsoft.NET.Sdk">proyecto .NET Core 2.2 en el que quería los archivos appsettings.json / appsettings.Development.json bien anidados, tal como lo hacen automáticamente para los <Project Sdk="Microsoft.NET.Sdk.Web">proyectos.

Esto es lo que tuve que agregar al .CSPROJ:

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

Después de eso, tuve que descargar / recargar el proyecto para que el cambio surtara efecto en el Explorador de soluciones. Tenga en cuenta que también configuro estos archivos para que siempre se copien en el directorio de salida.

David McClelland
fuente
6

Si desea utilizar un comodín en lugar de crear manualmente cada entrada, agregar estas líneas a su archivo .csproj significa que cualquier cosa como Foo.tests.cs se anida automáticamente en Foo.cs

Probado y funcionando en VS2019 con .NET Core 3.1.0

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

Si usa .netstandardx.x, no puede usar NestedIn . No funciona.

Puede hacerlo manualmente en su .csproj

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

Si usa el mismo prefijo, anidará los archivos automáticamente.

Ejemplo:

AsemblyInfo.cs 
AsemblyInfo.local.cs
Miguel Domingues
fuente
1
La pregunta era sobre .NET Core. ¿Puedes aclarar tu duda?
Miguel Domingues
2
¿Lo has probado en VS2017? Tengo una solución abierta en este momento que tiene .NetFramework 4.7.1, Core 2.0 y Standard 2.1. Intenté agregar un Class.cs y luego un Class.local.cs en un proyecto de cada tipo. Sin anidación automática. El anidamiento manual funciona bien. VS2017 (15.7.4)
Andrew Steitz
Visual Studio 2017 15.9.3: los archivos con el mismo prefijo se anidan automáticamente en el Explorador de soluciones
brsfan