Дерево зависимостей.NET Core

Можно ли просмотреть зависимости для проекта в ядре приложения.net? я использую Visual Studio 2017 Professional,

На данный момент у меня есть следующие пакеты самородков, на которые есть ссылки в моем csproj,

<ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.1" />
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Identity" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.2" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.2" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.1" />
    <PackageReference Include="SimpleInjector.Integration.AspNetCore.Mvc" Version="4.0.8" />
</ItemGroup>

Где вы можете перемещаться по зависимостям.

зависимости

Но это затрудняет поиск конкретной зависимости - дерево хорошо, если вы знаете, что ищете. Есть ли способ вывести плоский список зависимых сборок и их версий?

5 ответов

Решение

Вы можете добавить цель msbuild в ваш файл проекта (внутри <Project> элемент) вот так:

<Target Name="PrintAllReferences" DependsOnTargets="ResolvePackageDependenciesForBuild">
  <Message Importance="high" Text="Referenced package: %(PackageDefinitions.Identity)" />
</Target>

Который вы можете назвать так (строка без имени родительского пакета означает, что на него ссылается проект напрямую):

$ dotnet msbuild /nologo /t:PrintAllReferences
  Referenced package: Microsoft.NETCore.Platforms/1.1.0
  Referenced package: Microsoft.NETCore.Targets/1.1.0
  Referenced package: Microsoft.Win32.Primitives/4.3.0
  Referenced package: NETStandard.Library/1.6.1
  Referenced package: runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.native.System/4.3.0
  Referenced package: runtime.native.System.IO.Compression/4.3.0
  Referenced package: runtime.native.System.Net.Http/4.3.0
  Referenced package: runtime.native.System.Security.Cryptography.Apple/4.3.0
  Referenced package: runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: System.Buffers/4.3.0
  Referenced package: System.Collections/4.3.0
  …

Если вам нужно "дерево обратной зависимости" - список пакетов и какие пакеты ссылаются на них - вы можете сделать что-то похожее на:

<Target Name="PrintPackagesAndParents" DependsOnTargets="ResolvePackageDependenciesForBuild">
  <Message Importance="high" Text="* %(PackageDependencies.Identity) referenced by:%0a^---@(PackageDependencies->'%(ParentPackage) - target %(ParentTarget)', '%0a^---')" />
</Target>

который производит следующий вывод:

$ dotnet msbuild /nologo /t:PrintPackagesAndParents
  * JetBrains.Annotations/10.2.1 referenced by:
  ^--- - target .NETStandard,Version=v1.3
  * System.IO.FileSystem.Primitives/4.0.1 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  ^---System.IO.Compression.ZipFile/4.0.1 - target .NETStandard,Version=v1.3
  ^---System.IO.FileSystem/4.0.1 - target .NETStandard,Version=v1.3
  ^---System.Xml.ReaderWriter/4.0.11 - target .NETStandard,Version=v1.3
  * System.Linq/4.1.0 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  ^---System.Security.Cryptography.Encoding/4.0.0 - target .NETStandard,Version=v1.3
  * System.Linq.Expressions/4.1.0 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  * System.Net.Http/4.1.0 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  * System.Net.Primitives/4.0.11 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  ^---System.Net.Http/4.1.0 - target .NETStandard,Version=v1.3
  ^---System.Net.Sockets/4.1.0 - target .NETStandard,Version=v1.3
  …

На самом деле документации по этим элементам нет, но они имеют "публичное" имя и генерируются задачей ResolvePackageDependencies, которая выполняется как часть цели RunResolvePackageDependencies и создает несколько очень полезных элементов: TargetDefinitions, PackageDefinitions, PackageDependencies, FileDependencies а также DiagnosticMessages,

Это вспыхнуло сегодня в Morning Brew что может стоить посмотреть:

Мартин Бьоркстром Dotnet Зависит

На самом деле вы можете довольно легко искать зависимости конкретного проекта в Visual Studio.

Просто щелкните правой кнопкой мыши "Зависимости" и выберите "Область действия". И тогда вы можете напрямую искать зависимости. h ttps://stackru.com/images/d6ecc16367d672ec363028d0f09883963de46df6.png

В раскрывающемся списке, если панель поиска, отметьтеSearch within file contentsиSearch within external items, и введите пакет, который вы хотите найти, чтобы увидеть дерево зависимостей, если этот пакет

Возможно, вам будет проще проанализировать вывод изdotnet list packageкоманды напрямую:

      dotnet list package --include-transitive

Он по-прежнему разделяет каждый csproj, но сохраняет их на одном «уровне», и текст, вероятно, легче анализировать:

      dotnet list package --include-transitive

Project 'TestApp' has the following package references
   [net6.0]:
   Top-level Package         Requested             Resolved
   > System.CommandLine      2.0.0-beta1.21308.1   2.0.0-beta1.21308.1

   Transitive Package      Resolved
   > Crayon                2.0.62
   > SomeDep               1.0.0
   > Microsoft.CSharp      4.4.1
   > AnotherDep            1.0.0
   > System.Memory         4.5.4

// ...
Другие вопросы по тегам