VS2017 Solution Explorer for .NET Core(非ASP.NET Core)プロジェクトでファイルをネストできますか?


86

「古い学校」のMSBuildプロジェクトでは、たとえばVS2017のWindowsフォームでまだ使用されているように、ファイルは次の方法で「ネスト」できます。 DependentUponに、ファイルはcsprojファイルのアイテムをます。

これを使用して、NodaTimeでユニットテストをグループ化しました。

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

これにより、簡単にナビゲートできるテストが実現しました。

ネストされたテスト

project.json.NET Coreに移行したときにこの機能が「失われた」ことを知っていましたが、MSBuildに変換したときにこの機能が戻ることを望んでいました。ただし、.NET Core SDK(ルート要素<Project Sdk="Microsoft.NET.Sdk">)に基づくMSBuildプロジェクトItemGroupは、「古い学校」プロジェクトと同じ要素を使用して手動で追加された場合でも、Visual Studio2017では同じ扱いを受けないようです。

ASP.NET Coreプロジェクトは、縮小されたCSSとJavascriptの自動ネストを受け取りますが、それを.NET CoreライブラリプロジェクトのC#に適用する方法は明確ではありません。

回答:


106

Microsoft.NET.Sdk次のようなものを使用して、自分のスタイルのプロジェクトの1つで動作させています。

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

ここでの秘訣は、のUpdate代わりに使用することですInclude。これは、暗黙のアイテムがメインプロジェクトの前にインポートされたpropsファイルから取得されているためです。追加Includeは、すでに含まれているファイルには影響しませんが、を使用して変更できますUpdate


2
さて、これは奇妙です-私はそれを試したと確信しています、そしてそれはうまくいきませんでした。今です。非常に、非常に奇妙です。ああ、それは「含める」ではなく「更新」です。
ジョンスキート2017年

1
インクルードとアップデートが違いを生む理由が正確にはわからないことを認めなければなりません。いくつかの追加情報を提供するためにツールの人々の1人が大好きです。
マシューキング

2
@MatthewKing:私の推測では、これ*.csはデフォルトですでに含まれているためであり、したがってネストされた要素のコンテンツは無視されます。
ジョンスキート2017年

1
@JonSkeet、ええ...あなたが言ったようにそれは奇妙です...私は別のプロジェクトでもう一度それを試しました、そしてそれはうまくいきました。テストするクラスの背後にテストをネストしたいのですが、何百ものファイルに対して手動でテストを行うのはおかしいでしょう...この拡張機能を記述しても、プロジェクトファイルは見栄えがよくありません。それで、私はついにMicrosoft.NET.Sdk.Webクラスライブラリにも常に使用することにしました。これで、ネストを構成する必要はまったくありません。
Pavel Agarkov 2018

1
これをテストしたばかりで、同じBuildAction名を使用する必要があります。たとえば、ファイルのプロパティに基づいて、「Compile」を「Content」または「None」に置き換えます。私の場合、それは「コンテンツ」だった
SM3RKY

11

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 Core3.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
質問は.NETCoreについてでした。疑問を明確にできますか?
Miguel Domingues

2
VS2017で試しましたか?現在、.NetFramework 4.7.1、Core 2.0、およびStandard2.1を備えたソリューションを開いています。各タイプのプロジェクトにClass.csを追加してからClass.local.csを追加してみました。自動ネストはありません。手動のネストは正常に機能します。VS2017(15.7.4)
Andrew Steitz

Visual Studioの2017 15.9.3:同じ接頭辞を持つファイルが自動的にソリューションエクスプローラにネストされている
brsfan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.