#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, ссылки на пакеты являются переходными. Однако я не нашел в этом решения главной проблемы. И мой инструментарий (в данном случае Райдер) по-прежнему предполагает, что я добавляю ссылки на пакеты непосредственно в проекты, когда символы недоступны.