Они не те кем кажутся
Транзитивные
зависимости
Гордиенков Андрей
@violettape
my@violet-tape.net
Download presentation how it should be
from here
Транзитивность
A->B, B->C
A->C
Транзитивная зависимость — это тот артефакт, от которого зависит
прямая зависимость проекта.
A v1
B v1 C v1 D v2
E v1 D v1
Пакетные менеджеры
• Self-contained model (npm)
• Share model (NuGet)
projectproject
http://stackoverflow.com/questions/4256994/openwrap-vs-nuget
naos.deployment.Core
(get-package -list naos.deployment.Core| select -ExpandProperty
dependencies) -replace ":|","`r`n"
NuGet 2.x – Визуальный помощник
naos.deployment.Core
Удаление
- RemoveDependencies
NuGet Broken by Design
• Это просто макрос
• Минимум подтверждений от пользователя
• Что устанавливать? По умолчанию последнюю стабильную версию
• Как решать зависимости? Выбрать наименьшую версию
удовлетворяющую пакетам. См.п1.
• Какой набор DLL установить? Чтобы лучше всего подходил версии
фреймворка проекта
PS> Полные права при запуске скриптов
- Возможность запускать любые скрипты
• Newtonsoft.JSON запускает браузер
+ Настройка MSBuild
+ Открытие Readme
+ Скаффолдинг
+ Трансформации XML конфигов
PS> next__
Тесное переплетение со студией
- Установкапакетов требует студии
- Зависимости указаны в *.csproj
+ Все действия полностью аналогичны ручному процессу
Нет новых концепций
Явные минусы
<Reference Include="Dapper, Version=1.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesDapper.1.42libnet45Dapper.dll</HintPath>
<Private>True</Private>
<Reference Include="Its.Log, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesIts.Log.2.8.3libnet40Its.Log.dll</HintPath>
<Private>True</Private>
</Reference>
Явные минусы
<Reference Include="Dapper, Version=1.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesDapper.1.42libnet45Dapper.dll</HintPath>
<Private>True</Private>
<Reference Include="Its.Log, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesIts.Log.2.8.3libnet40Its.Log.dll</HintPath>
<Private>True</Private>
</Reference>
Фиксация версии пакета
Явные минусы
<Reference Include="Dapper, Version=1.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesDapper.1.42libnet45Dapper.dll</HintPath>
<Private>True</Private>
<Reference Include="Its.Log, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesIts.Log.2.8.3libnet40Its.Log.dll</HintPath>
<Private>True</Private>
</Reference>
Конфликты в csproj
Явные минусы
<Reference Include="Dapper, Version=1.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesDapper.1.42libnet45Dapper.dll</HintPath>
<Private>True</Private>
<Reference Include="Its.Log, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesIts.Log.2.8.3libnet40Its.Log.dll</HintPath>
<Private>True</Private>
</Reference>
Multi-Homed проект
Явные минусы
<Reference Include="Dapper, Version=1.40.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesDapper.1.42libnet45Dapper.dll</HintPath>
<Private>True</Private>
<Reference Include="Its.Log, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..packagesIts.Log.2.8.3libnet40Its.Log.dll</HintPath>
<Private>True</Private>
</Reference>
Перенаправление проекта
Будущее NuGet
• Не трогать *.csproj
• Автоматический ретаргетинг проекта
• Глобальная инсталляция пакетов
• Множественные подключения
• «Плавающие» версии пакетов
• Установка из командной строки (не PS консоль VS)
Демо
Что же делать?
5.3.20 +1-αMajor Minor Patch Qualifier Metadata
Semantic Versioning
http://semver.org/lang/ru/
Без обратной
совместимости
Новый
функционал
Исправление
багов
Служебная
информация о сборке
Предрелизная
метка
Обязательная обратная совместимость
Локальный, проверенный руками
репозиторий?
+ Свое родное
+ Безопасные пакеты (…кажется)
- Всё проверять на практике
- Но всё проверить невозможно
- Можетбыстро устареть
NuGet 2.x - Dep Version
<configuration>
<config>
<add key="DependencyVersion" value="HighestPatch" />
</config>
</configuration>
Возможные значения
- Lowest: самая ранняя возможная версия
- HighestPatch
- HighestMinor
- Highest: самая последняя версия
NuGet 2.x – Визуальный помощник
NuGet 3.x Визуальный помощник
Project.json (> NuGet 3.0)
• https://github.com/aspnet/Home/wiki/Project.json-file
• https://docs.nuget.org/Consume/ProjectJson-Intro
• Только для
• Universal Windows Platform
• Portable class libraries
• ASP.NET 5 applications
NuGet 3.x
Paket
https://github.com/fsprojects/Paket
http://fsprojects.github.io/Paket/
install-packagepaket
paket init
paket install
Можно подключать пакеты NuGet
Можно подключать файлы из GitHub
https://fsprojects.github.io/Paket/github-dependencies.html
Принципы работы Paket
Следование принципам SemVer
Неинвазность работы с csproj и работа из консоли
Максимально предсказуемая политика по работе с версиями
библиотек.
Файлы Paket
• paket.dependencies (.sln)
• все зависимости решения
• paket.lock (.sln)
• Описание ресурсов
• Описание всех транзитивных зависимостей для каждой сборки
индивидуально
• paket.references
• Опиание прямых зависимостей (только имена)
paket.dependencies
paket.lock
paket.references
https://fsprojects.github.io/Paket/references-files.html
Конвертация
paket convert-from-nugget -f
Итого
• Используйте новый NuGet 3.2Paket
• Для NuGet используйте графический
интерфейс
• Используйте политики обновлений для
Nuget 2.X
• Следите за зависимостями в проекте
• Следовать SemVer
Ссылки
• http://stackoverflow.com/questions/4256994/openwrap-vs-nugget
• http://blog.nuget.org/20141010/nuget-is-broken.html
• https://fsprojects.github.io/Paket/
• https://docs.nuget.org/Consume/ProjectJson-Intro
• http://codepyre.com/2012/10/nuget-youre-doing-it-wrong/
• http://habrahabr.ru/company/jugru/blog/191246/ про Maven
• https://github.com/McSherry/libSemVer.NET
Контакты
Андрей Гордиенков
my@violet-tape.net
@violettape
http://softblog.violet-tape.ru

Transitive dependencies