Есть ли причина, по которой я не должен помещать все ссылки на мои пакеты в каталог.Сборка.реквизит?

#c# #msbuild

Вопрос:

Я начинаю создавать гораздо больше CSPROJ-файлов, чтобы разбить свой код на более модульные компоненты. Когда я это делаю, я понимаю, что добавлять <PackageReference> что-то в мои проекты по мере переноса кода стало довольно утомительно. На самом деле, ИМХО, управлять этим становится довольно хлопотно.

Прямо сейчас у меня есть Directory.Build.props » а » и «а Directory.Build.targets «. Целевой файл, который я использую только для централизации версий пакетов:

 <Project>
  <ItemGroup>
    <!-- Test Packages -->
    <PackageReference Update="Microsoft.NET.Test.Sdk" Version="16.*" />
    <PackageReference Update="NSubstitute" Version="4.*" />
    <PackageReference Update="NUnit" Version="3.*" />

    <!-- Non-Test Packages -->
    <PackageReference Update="Autofac" Version="6.*" />
    <PackageReference Update="Autofac.Extensions.DependencyInjection" Version="7.*" />
    <PackageReference Update="Autofac.Extras.AggregateService" Version="6.*" />
    <PackageReference Update="BlazorPro.BlazorSize" Version="5.*" />
  </ItemGroup>
</Project>
 

Мой Directory.Build.props файл в основном предназначен для групп свойств, но я автоматически добавляю пакеты модульных тестов только в тестовые проекты. Я также добавляю некоторые пакеты «утилит» (частные). Вот урезанный пример:

 <Project>
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <Nullable>enable</Nullable>
    <WarningLevel>9999</WarningLevel>
    <DebugType>embedded</DebugType>
    <EnableNETAnalyzers>true</EnableNETAnalyzers>
  </PropertyGroup>

  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
      <_Parameter1>$(AssemblyName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="JetBrains.Annotations" PrivateAssets="All"/>
    <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" PrivateAssets="All"/>
    <PackageReference Include="Nerdbank.GitVersioning" PrivateAssets="All" />
  </ItemGroup>

  <ItemGroup Condition="$(ProjectName.EndsWith('.Tests'))">
    <PackageReference Include="Microsoft.NET.Test.Sdk" />
    <PackageReference Include="NSubstitute" />
    <PackageReference Include="NUnit" />
  </ItemGroup>
</Project>
 

Я уже действительно видел выгоду в автоматическом включении пакетов для тестовых проектов. Но почему бы мне не сделать это для остальных моих посылок?

Вот в чем, я надеюсь, заключаются преимущества:

  • Мне не нужно добавлять пакеты в несколько проектов. Я добавляю это в одном месте.
  • Я могу избавиться от .targets файла. Поскольку все ссылки на пакеты будут включены в одном месте, я могу просто управлять версиями в .props файле.
  • Проекты, которые на самом деле не ссылаются на какие-либо символы в сборке в .props файле, фактически не будут компилировать ее; это означает, что, надеюсь, ссылки на проекты, которые не используются, будут «удалены», т. Е. Без каких-либо затрат на размер или что-либо еще, если таковые имеются.

Я пытаюсь понять, почему я не должен этого делать. Я понимаю, что, начиная с проектов формата SDK, ссылки на пакеты являются переходными. Однако я не нашел в этом решения главной проблемы. И мой инструментарий (в данном случае Райдер) по-прежнему предполагает, что я добавляю ссылки на пакеты непосредственно в проекты, когда символы недоступны.