文件可以嵌套在VS2017解决方案资源管理器的.NET Core(非ASP.NET Core)项目中吗?


85

在“老派” MSBuild项目中(例如VS2017中Windows窗体仍在使用),可以通过DependentUponcsproj文件中的项目将文件“嵌套” 。

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

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

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

嵌套测试

我知道在移至project.json.NET Core时会“丢失”此功能,但希望它在转换为MSBuild时会返回。但是,即使基于.NET Core SDK(根元素<Project Sdk="Microsoft.NET.Sdk">)的MSBuild项目在Visual Studio 2017中看起来也没有得到相同的处理,即使ItemGroup使用与``老派''项目相同的元素手动添加了。

ASP.NET Core项目会收到针对最小的CSS和Javascript的自动嵌套,但是尚不清楚如何将其应用于.NET Core库项目中的C#。

Answers:


104

Microsoft.NET.Sdk使用类似于以下内容的样式在其中一个样式项目中工作:

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

这里的窍门是使用Update而不是Include。这是因为隐式项目来自于在主项目之前导入的props文件。附加Include文件不会影响已经包含的文件,但是可以使用进行修改Update


2
好的,这很奇怪-我确定我已经尝试过了,但是没有用。现在是。非常非常奇怪。啊-是“更新”而不是“包含”。
乔恩·斯基特

1
我必须承认我不确定为什么Include vs Update会有所作为。希望其中一位工具人员能够提供一些其他信息。
马修·金

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下

在.NET Core 3.1.0中经过测试并在VS2019中工作

  <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)
Andrew Steitz

Visual Studio 2017 15.9.3:具有相同前缀的文件将自动嵌套在解决方案资源管理器中
-brsfan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.