.NET Core(非ASP.NET Core)项目的文件可以嵌套在 VS2017 Solution Explorer 中吗?

Can files be nested in VS2017 Solution Explorer for .NET Core (non-ASP.NET Core) projects?

在 "old school" MSBuild 项目中 - 例如 VS2017 中的 Windows Forms 仍在使用 - 文件可以是 "nested" 通过 csproj 文件中的 DependentUpon 项目。

我用它在 Noda Time 中将单元测试组合在一起,例如

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

这导致了易于导航的测试:

我在为 .NET Core 迁移到 project.json 时有意 "lost" 此功能,但希望在转换为 MSBuild 时它会 return。但是,看起来基于 .NET Core SDK(根元素 <Project Sdk="Microsoft.NET.Sdk">)的 MSBuild 项目在 Visual Studio 2017 中没有得到相同的处理,即使手动添加 ItemGroup与 "old school" 项目相同的元素。

ASP.NET 核心项目接收缩小 CSS 和 Javascript 的自动嵌套,但不清楚如何将其应用于 .NET Core 库项目中的 C#。

我让它在我的一个 Microsoft.NET.Sdk 风格的项目中使用类似于以下的东西:

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

这里的技巧是使用 Update 而不是 Include。这是因为隐式项目来自在主项目之前导入的 props 文件。额外的 Include 不会影响已经包含的文件,但可以使用 Update.

修改它们

如果您使用相同的前缀,它将自动嵌套文件。

示例:

AsemblyInfo.cs 
AsemblyInfo.local.cs

如果您使用 .netstandardx.x,则不能使用 NestedIn。没用。

您可以在 .csproj 中手动执行此操作

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

在 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>

之后,我必须 unload/reload 项目才能使更改在解决方案资源管理器中生效。请注意,我还将这些文件设置为始终复制到输出目录。

如果您想使用通配符而不是手工制作每个条目,将这些行添加到您的 .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>