【问题标题】:Can files be nested in VS2017 Solution Explorer for .NET Core (non-ASP.NET Core) projects?文件可以嵌套在 .NET Core(非 ASP.NET Core)项目的 VS2017 解决方案资源管理器中吗?
【发布时间】:2017-10-06 08:43:31
【问题描述】:

在“老派”的 MSBuild 项目中——例如 VS2017 中的 Windows 窗体仍在使用——文件可以通过 csproj 文件中的 DependentUpon 项“嵌套”。

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

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

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

在迁移到 .NET Core 的 project.json 时,我故意“丢失”了此功能,但希望在转换为 MSBuild 时它会恢复。但是,看起来基于 .NET Core SDK(根元素 &lt;Project Sdk="Microsoft.NET.Sdk"&gt;)的 MSBuild 项目在 Visual Studio 2017 中没有得到相同的处理,即使手动添加 ItemGroup 并使用与“旧学校”项目。

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

【问题讨论】:

    标签: msbuild .net-core visual-studio-2017 csproj


    【解决方案1】:

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

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

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

    【讨论】:

    • 好吧,这很奇怪——我确定我试过了,但没有成功。现在是。非常非常离奇。啊 - 这是“更新”而不是“包含”。
    • 我必须承认我不确定为什么 Include vs Update 会有所作为。希望其中一位工具人员提供一些额外的信息。
    • @MatthewKing:我的猜测是因为*.cs已经默认包含了,所以嵌套的元素内容被忽略了。
    • @JonSkeet,是的......正如你所说,这很奇怪......我在另一个项目中又试了一次,它奏效了。我确实想嵌套tests behind classes they test,但是手动为数百个文件这样做会很疯狂......即使我为此编写扩展名 - 项目文件看起来也不会很好。所以我最终决定总是使用Microsoft.NET.Sdk.Web,即使是类库。现在我根本不需要配置嵌套。
    • 我刚刚对此进行了测试,您需要使用相同的 BuildAction 名称,例如根据您的文件属性将“编译”替换为“内容”或“无”。就我而言,它是“内容”
    【解决方案2】:

    在 Visual Studio 2019 中,我有一个 .NET Core 2.2 &lt;Project Sdk="Microsoft.NET.Sdk"&gt; 项目,我想要其中嵌套良好的 appsettings.json / appsettings.Development.json 文件,就像它们为 &lt;Project Sdk="Microsoft.NET.Sdk.Web"&gt; 项目自动执行的操作一样。

    这是我必须添加到 .CSPROJ 的内容:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果你使用 .netstandardx.x 你不能使用 NestedIn 。它不工作。

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

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

        【讨论】:

          【解决方案5】:

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

          例子:

          AsemblyInfo.cs 
          AsemblyInfo.local.cs
          

          【讨论】:

          • 问题是关于 .NET Core。你能澄清你的疑问吗?
          • 你在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:具有相同前缀的文件会自动嵌套在解决方案资源管理器中
          猜你喜欢
          • 2019-01-03
          • 2017-10-20
          • 1970-01-01
          • 2018-04-16
          • 2014-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多