94 votes

Les fichiers peuvent-ils être imbriqués dans l'explorateur de solutions VS2017 pour les projets .NET Core (non-ASP.NET Core) ?

Dans les projets MSBuild "de la vieille école" - tels qu'ils sont encore utilisés par Windows Forms dans VS2017 par exemple - les fichiers pouvaient être "imbriqués" via une balise DependentUpon dans le fichier csproj.

Je l'ai utilisé pour regrouper les tests unitaires dans Noda Time, par ex.

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

Cela a conduit à des tests faciles à réaliser :

Nested tests

J'ai sciemment "perdu" cette fonctionnalité lorsque j'ai déménagé vers project.json pour .NET Core, mais j'avais espéré qu'il reviendrait lors de la conversion à MSBuild. Cependant, il semble que les projets MSBuild basés sur le SDK .NET Core (élément racine <Project Sdk="Microsoft.NET.Sdk"> ) ne bénéficient pas du même traitement dans Visual Studio 2017, même si un fichier ItemGroup est ajouté manuellement avec les mêmes éléments que le projet "old school".

Les projets ASP.NET Core bénéficient d'une imbrication automatique pour les feuilles de style en cascade (CSS) et le langage Javascript, mais la façon d'appliquer cela à C# dans les projets de bibliothèques .NET Core n'est pas claire.

114voto

MatthewKing Points 1616

Je l'ai fait fonctionner dans un de mes Microsoft.NET.Sdk -en utilisant quelque chose de similaire à ce qui suit :

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

L'astuce ici est d'utiliser Update au lieu de Include . Cela est dû au fait que les éléments implicites proviennent d'un fichier props qui est importé avant le projet principal. Un élément supplémentaire Include n'affectera pas les fichiers qui sont déjà inclus, mais ils peuvent être modifiés en utilisant Update .

3 votes

Ok, c'est bizarre - je suis sûr d'avoir essayé ça, et ça ne marchait pas. Maintenant ça marche. Très, très bizarre. Ah - c'est la "mise à jour" plutôt que "l'inclusion".

0 votes

Avez-vous essayé cette extension ?

0 votes

@AlexanderClare : Ce lien est cassé, mais je pense que je connais celui dont vous parlez - et il n'a pas fonctionné.

14voto

Jinlye Points 316

Si vous souhaitez utiliser un caractère générique au lieu de créer manuellement chaque entrée, ajoutez les lignes suivantes à votre fichier .csproj signifie que tout ce qui ressemble à Foo.tests.cs est automatiquement imbriqué sous Foo.cs

Testé et fonctionnant dans VS2019 avec .NET Core 3.1.0

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

13voto

David McClelland Points 735

Dans Visual Studio 2019, j'ai une application .NET Core 2.2. <Project Sdk="Microsoft.NET.Sdk"> dans lequel je voulais les fichiers appsettings.json / appsettings.Development.json bien imbriqués, comme ils le font automatiquement pour <Project Sdk="Microsoft.NET.Sdk.Web"> projets.

Voici ce que j'ai dû ajouter au .CSPROJ :

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

Après cela, j'ai dû décharger/recharger le projet pour que le changement prenne effet dans Solution Explorer. Notez que j'ai également configuré ces fichiers pour qu'ils soient toujours copiés dans le répertoire de sortie.

1voto

Batuhan Points 392

Si vous utilisez .netstandardx.x vous ne pouvez pas utiliser Emboîté dans . Ça ne marche pas.

Vous pouvez le faire manuellement dans votre fichier .csproj.

<ItemGroup><Compile Include="BaseClass">ChildClass.cs</Compile></ItemGroup>

-7voto

Miguel Domingues Points 276

Si vous utilisez le même préfixe, les fichiers seront automatiquement imbriqués.

Exemple :

AsemblyInfo.cs 
AsemblyInfo.local.cs

1 votes

La question portait sur .NET Core. Pouvez-vous clarifier votre doute ?

2 votes

L'avez-vous essayé dans VS2017 ? J'ai une solution ouverte en ce moment qui a .NetFramework 4.7.1, Core 2.0 et Standard 2.1. J'ai essayé d'ajouter une Class.cs, puis une Class.local.cs dans un projet de chaque type. Pas d'imbrication automatique. L'imbrication manuelle fonctionne bien. VS2017 (15.7.4)

0 votes

Visual Studio 2017 15.9.3 : Les fichiers ayant le même préfixe sont automatiquement imbriqués dans l'explorateur de solutions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X