Nuget Packages. Личный опыт обновления пакетов
Доброго времени суток, жители хабра. Сегодня хотелось бы обсудить с Вами тему обновления пакетов через Nuget Packet Manager и поговорить о способах сделать это правильно. Предлагаю рассмотреть ситуации, с которыми мне довелось сталкиваться, и решения для них, которые пришли в голову мне/моим коллегам. С удовольствием выслушаю ваши решения этих проблем/новых проблем, с которыми довелось сталкиваться Вам!
Обновление до конкретной версии некоторых пекеджей
В нашем случае нам нужно было обновить группу пакетов до определённой версии, назовём их условно: UPacket1, UPacket2, UPacket3, которые нужно было обновить с версии 1 до версии 2, для наглядности. Проблема появилась тогда, когда обнаружилось, что для каждого из них стоит еще много других пакетов в депенденси*, важно отметить, что для каждого из пакетов в депенденси стоит условие “>= версия” (если у вас условие строгое, то подобной проблемы возникнуть не должно). Если просто написать команду Update-Package UPacket1, то все пакеты из его списка зависимостей обновятся до максимально доступной версии автоматически – а нам это не было нужно. Почему? Например, у UPacket1 есть зависимость от Microsoft.AspNet.Mvc, которое в результате будет обновлено до 5-й версии, хотя весь проект изначально рассчитан под Mvc 4. Мы решили вопрос банальным добавлением для нужных пакетов (в packages.config) атрибута allowedVersions="[текущая_версия]", пример:
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" allowedVersions="[4.0.30506.0]" />
Само собой решение лёгкое и мы обошлись малой кровью (хотя с некоторыми пакетами пришлось повозиться, потому как их нужно было обновить до определённой версии но не максимальной, чтобы не делать это вручную, можно также применить этот атрибут), но сами поиски этого решения заняли какое-то время.
Следует также отметить, что версии в этом атрибуте можно указывать через запятую/тире, с разными скобками. Детальней о версиях и этом атрибуте можно глянуть тут.
Была идея написать такую программу, которая бы помогла этот процесс автоматизировать, но пока руки не дошли.
Конфликты в файлах контента при обновлении пакетов
Не редко возникает ситуация, когда Вы модифицируете файлы, предоставленные в пакетах. В таком случае при дальнейших попытках обновить такой пакет могут возникать конфликты файлов. Обычно ничего страшного в этом нет, мы просто пропускаем файл-конфликт (скипаем*) и дальше просто ищем этот файл в папке с пакетами и обновляем нужный файл в проекте вручную (сравнивая их, что изменилось, что нужно добавить/удалить в файле проекта). Для процесса сравнивания и соединения (мерджа*) файлов я использую очень удобную программу — Araxis. Но как быть если в Вашем проекте около 100 пакетов и по десятку конфликтов во многих из них (в нашем проекте есть около 10-ти тем, каждая из которых предоставляет многое количество файлов). Araxis умеет также сравнивать и папки целиком, именно по этой причине я решил написать программу, которая будет собирать из всех пакетов (из их подпапок “Content”) все файлы в одно место. Потом я просто сравниваю эти файлы с файлами проекта целым скопом, это гораздо быстрее чем заходить вручную в каждый пакет и сравнивать его контент с проектом. Если Вам лень писать такую программу и таких человек наберется несколько, я выложу её отдельным топиком с описанием.
Пока это всё из интересного, чем можно было бы поделиться на эту тему. По мере возникновения чего-то нового буду обновлять или добавлять новые части. А с какими проблемами такого рода сталкивались Вы? Как решали? Пишите в комментах, можно будет обсудить, а самое интересное вынести в статью.
Автор: vkushnir