Các tệp có thể được lồng trong VS2017 Solution Explorer cho các dự án .NET Core (non -ASP.NET Core) không?


85

Trong các dự án MSBuild "cũ" - ví dụ như vẫn được Windows Forms sử dụng trong VS2017 - các tệp có thể được "lồng" thông qua một DependentUponmục trong tệp csproj.

Tôi đã sử dụng điều này để nhóm các bài kiểm tra đơn vị lại với nhau trong Noda Time, ví dụ:

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

Điều đó dẫn đến các bài kiểm tra dễ điều hướng:

Kiểm tra lồng nhau

Tôi cố tình "mất" tính năng này khi chuyển sang project.json.NET Core, nhưng đã hy vọng nó sẽ trở lại khi chuyển đổi sang MSBuild. Tuy nhiên, có vẻ như các dự án MSBuild dựa trên .NET Core SDK (phần tử gốc <Project Sdk="Microsoft.NET.Sdk">) không nhận được cách xử lý tương tự trong Visual Studio 2017, ngay cả khi một dự án ItemGroupđược thêm theo cách thủ công với các phần tử giống như dự án "old school".

Các dự án ASP.NET Core nhận lồng tự động cho CSS và Javascript được rút gọn, nhưng không rõ cách áp dụng điều đó cho C # trong các dự án thư viện .NET Core.

Câu trả lời:


104

Tôi có nó hoạt động trong một trong những Microsoft.NET.Sdkdự án theo phong cách của tôi bằng cách sử dụng thứ gì đó tương tự như sau:

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

Mẹo ở đây là sử dụng Updatethay vì Include. Điều này là do các mục ngầm định đến từ một tệp đạo cụ được nhập trước dự án chính. Phần bổ sung Includesẽ không ảnh hưởng đến các tệp đã được bao gồm, nhưng chúng có thể được sửa đổi bằng cách sử dụng Update.


2
Được rồi, điều này thật kỳ lạ - tôi chắc chắn rằng tôi đã thử nó, và nó không hoạt động. Nó bây giờ là. Rất, rất kỳ lạ. À - đó là "Cập nhật" chứ không phải "Bao gồm".
Jon Skeet

1
Tôi phải thừa nhận rằng tôi không chắc chắn chính xác lý do tại sao Bao gồm và Cập nhật lại tạo ra sự khác biệt. Rất thích một trong những người cung cấp công cụ cung cấp một số thông tin bổ sung.
Matthew King

1
@MatthewKing: Tôi đoán rằng đó là vì *.csnó đã được đưa vào theo mặc định và nội dung phần tử lồng nhau do đó bị bỏ qua.
Jon Skeet

1
@JonSkeet, vâng ... như bạn đã nói nó thật kỳ lạ ... Tôi đã thử nó một lần nữa trong một dự án khác và nó đã hoạt động. Tôi muốn lồng các bài kiểm tra đằng sau các lớp mà họ kiểm tra , nhưng sẽ thật điên rồ nếu làm điều đó cho hàng trăm tệp theo cách thủ công ... Ngay cả khi tôi viết phần mở rộng cho tệp này - tệp dự án trông sẽ không đẹp. Vì vậy, cuối cùng tôi quyết định luôn sử dụng Microsoft.NET.Sdk.Webngay cả cho các thư viện lớp học. Bây giờ tôi không phải cấu hình lồng nhau nữa.
Pavel Agarkov

1
Tôi vừa thử nghiệm điều này và bạn cần sử dụng cùng một tên BuildAction, ví dụ như thay thế 'Biên dịch' bằng 'Nội dung' hoặc 'Không có' dựa trên thuộc tính tệp của bạn. Trong trường hợp của tôi, đó là 'Nội dung'
SM3RKY

10

Trong Visual Studio 2019, tôi có một <Project Sdk="Microsoft.NET.Sdk">dự án .NET Core 2.2 trong đó tôi muốn các tệp appsettings.json / appsettings.Development.json được lồng ghép độc đáo, giống như chúng tự động làm cho <Project Sdk="Microsoft.NET.Sdk.Web">các dự án.

Đây là những gì tôi phải thêm vào .CSPROJ:

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

Sau đó, tôi phải dỡ / tải lại dự án để thay đổi có hiệu lực trong Solution Explorer. Lưu ý rằng tôi cũng đặt các tệp này luôn được sao chép vào thư mục đầu ra.


6

Nếu bạn muốn ký tự đại diện nó thay vì tay crafting mỗi mục, thêm những dòng này để bạn csproj phương tiện tập tin mà bất cứ điều gì như Foo.tests.cs Automagically được lồng dưới Foo.cs

Đã thử nghiệm và hoạt động trong VS2019 với .NET Core 3.1.0

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

2

Nếu bạn sử dụng .netstandardx.x, bạn không thể sử dụng NestedIn . Nó không hoạt động.

Bạn có thể làm điều đó theo cách thủ công trong .csproj của bạn

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

-6

Nếu bạn sử dụng cùng một tiền tố, nó sẽ tự động lồng các tệp.

Thí dụ:

AsemblyInfo.cs 
AsemblyInfo.local.cs

1
Câu hỏi là về .NET Core. Bạn có thể làm rõ nghi ngờ của bạn?
Miguel Domingues

2
Bạn đã thử nó trong VS2017 chưa? Tôi có một giải pháp đang mở ngay bây giờ có .NetFramework 4.7.1, Core 2.0 và Standard 2.1. Tôi đã thử thêm Class.cs và sau đó là Class.local.cs trong mỗi loại dự án. Không có lồng tự động. Làm tổ thủ công hoạt động tốt. VS2017 (15.7.4)
Andrew Steitz

Visual Studio 2017 15.9.3: tập tin với tiền tố cùng sẽ được tự động được lồng trong Solution Explorer
brsfan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.