Обновление командной строки nuget не обнаруживает все пакеты.config, которые необходимо обновить
У нас есть шаг сборки, который устанавливает и обновляет пакеты nuget в решении на нашем сервере сборки (TeamCity). Недавно это перестало делать обновления правильно. Я исследовал это и обнаружил, что проблема, как представляется, заключается в том, что команда обновления в nuget не обновляет все проекты в решении. Я могу повторить это на моей локальной машине.
Когда я запускаю эту команду:
.nuget\NuGet.exe update Our.Company.sln -Source http:/ourTcServer:8888/guestAuth/app/nuget/v1/FeedService.svc -RepositoryPath packages -verbosity detailed
Я получаю список из 10 проектов, которые он собирается обновить
Found 10 projects with a packages.config file. (
Company.Project1.csproj,
Company.Project2.csproj,
Company.Project3.csproj,
Company.Project4.csproj,
Company.Project4.SubProject1.csproj,
Company.Project4.SubProject2.csproj,
Company.Project1.SubProject1.csproj,
Company.Project1.SubProject2.csproj,
Company.Project2.SubProject1.csproj,
Company.Project2.SubProject1.FurtherSubProject1.csproj)
Однако решение содержит 13 проектов, и все они содержат packages.config
файлы и, насколько я могу судить, ничем не отличаются от других проектов. Проекты - это отдельный проект, и его подпроекты и структура каталогов наших проектов соответствуют именам проектов (поэтому project1.subproject1 подразумевает, что subproject1 находится в папке внутри project1) в случае, если это важно. Все проекты с этой проблемой находятся в проекте, который имеет конкретные имена, такие как:
Company.Something.SomethingElse.Routing
Company.Something.SomethingElse.Routing.Tests
Company.Something.SomethingElse.Routing.Tests.Specifications
В случае, если часть имени в маршрутизации вызывает проблемы (у нас была проблема, прежде чем использовать слово Resources
в конце нашего названия пакета)
У нас есть более 50 решений, которые используют одинаковую конфигурацию сборки и этапы, и она прекрасно работает для всех из них. Это решение кажется единственным, которое не обновляется корректно.
Кто-нибудь знает, почему это может иметь место? Или кто-нибудь знает, что делает код, который находит пакеты в решении, что может привести к тому, что он не найдет некоторые файлы packages.config? Или что-нибудь, что может помочь отследить эту проблему?
2 ответа
Итак, проблема была в том, что мы переименовали некоторые из наших проектов и файлов.csproj и не удалили их в старые, неиспользуемые файлы проекта, а в nuget есть фрагмент кода, который находит файл проекта, в который он собирается обновить ссылки обновленные пакеты. Это делается путем нахождения всех файлов.csproj (или любого другого варианта файла проекта, который вы используете) в том же каталоге, что и packages.config. Если это не приводит к получению ровно 1 файла, то выдается исключение, которое впоследствии перехватывается и игнорируется, и ничего не регистрируется, поэтому вы не мудрее.
Надеюсь, это поможет кому-то еще в будущем. Возможно я.
Я обнаружил, что проблема, с которой я столкнулся, заключалась в том, что мои проекты не были в одном дереве каталогов решения.
nuget.exe update
Команда, когда данный файл решения ищет файлы packages.config, используя каталог решения в качестве отправной точки вместо просмотра каждого файла проекта в решении.
string[] packagesConfigFiles = Directory.GetFiles(
solutionDir, "*.config", SearchOption.AllDirectories);
Вы можете видеть, что они просто ищут файлы *.config, начиная с каталога решения.
Мои проекты и решения организованы так:
/Libraries/Shared/Shared.csproj
/Programs/NTService/NTService.csproj
/Programs/NTService.sln
В этом случае, если я запусту update для файла NTService.sln, он будет обновлять только ссылки NTService.csproj, поскольку он находится в том же дереве каталогов, что и файл NTService.sln.
Поскольку он просто просматривает все пакеты во всем дереве, я просто помещаю файл решения в корень моего репозитория, а затем запускаю обновление для него. Не имеет значения, какие проекты находятся в этом файле решения.