Рассмотрит репо/файловую структуру для нашего решения ...Может ли NuGet использовать пути загрузки пакетов для одного проекта?
Shared Repo (Checked out to D:/Shared/trunk)
├───Shared1.dll Project
└───Shared2.dll Project
App1 Repo (Checked out to C:/Code/App1/Trunk)
├───App1 Project (Refs Shared1.dll project)
├───App1.dll Project (Refs Shared1.dll and Shared2.dll projects)
└───App1.sln
App2 Repo (Checked out to C:/Code/App2/Trunk)
├───App2 Project (Refs Shared1.dll project)
├───App2a.dll Project (Refs Shared1.dll and Shared2.dll projects)
├───App2b.dll Project (Refs Shared1.dll and App2a.dll projects)
└───App2.sln
Чтобы сделать работу с кодом проще, мы привносим в совместных проектах непосредственно в решение приложения, то есть, например, если вы откроете App1.sln , это будет ваше дерево проекта ...
App1.sln
├───Shared1.dll Project
├───Shared2.dll Project
├───App1 Project (Refs Shared1.dll project)
└───App1.dll Project (Refs Shared1.dll and Shared2.dll projects)
Как вы можете видеть, два общих библиотек DLL находятся в отдельном хранилище, но включены в это решение. Visual Studio обрабатывает это без каких-либо проблем, предлагая вам обновлять несколько репозиториев при выполнении коммита против решения. Все в порядке, и это именно то, что мы хотим.
Проблема, которую мы имеем, однако, связана с NuGet. Из того, что мы понимаем, NuGet.config (и иерархия/приоритет чтения/применения) относится к файлу решения, поэтому ссылки на проекты NuGet соответствующим образом обновляются. Это вызывает проблемы в том, что ссылки на пакеты NuGet в Shared1.dll Shared2.dll относительно App1.sln, когда вы работаете в App1.sln, то есть если кто-то еще работает в App2.sln и не проверял их два ствола относительно друг друга точно так же, как и у вас, перерыв ссылок.
Наша задача - всегда следить за всеми тремя соединительными линиями в той же папке, что и братья и сестры, затем поместить папку для упаковки в качестве другого брата, добавив «../packages» в NuGet.config рядом с каждым решением , Это гарантирует, что ссылки никогда не сломаются, но заставляет местоположение проверок, которые могут быть проблемой.
C:/Code/
├───Shared Trunk
├───App1 Trunk
├───App2 Trunk
└───packages
Однако, если мы могли бы указать для каждого проекта пакета загрузки местоположения, мы могли бы поставить упаковки папки относительно самих проектов означает, что он не имеет значения, где вы проверить их на. Они всегда найдут нужные им пакеты. Да, это означает, что в нашем примере будут дублироваться загрузки пакетов, но пространство на диске не является проблемой. Поддержание кода.
C:/Code/
├───Shared Trunk
│ └─sharedpackages
├───App1 Trunk
│ └─app1packages
└───App2 Trunk
└─app2packages
Опять-таки, что мы хотим при открытии App1.sln, мы хотим, чтобы пакеты для Shared1.dll и Shared2.dll идти в папку, но пакеты «» sharedpackages используемых App1 и App1.dll идти в app1packages ,
Итак ... это возможно? Можете ли вы указать разные пути загрузки пакетов NuGet для каждого проекта независимо от того, в каком решении они находятся?
Как вы подозревали, это невозможно. NuGet в настоящее время всегда проверяет файл NuGet.Config относительно каталога решения. Поэтому проверка отдельных репозиториев на указанные относительные каталоги, как вы это сделали, является, пожалуй, единственным решением. –
Если вы создадите решение для своих общих проектов, то все ваши проекты будут ссылаться на папку пакетов в родительском. Затем вы можете объединить свое приложение и общие проекты, и все они будут использовать соответствующую относительную ссылку. – Kiliman
Я думал об этом изначально, но проблема в том, что когда вы возвращаете их обратно в одно решение (например, App1), NuGet полностью запутывается, не зная, куда его тянуть. Обновления также не работают. – MarqueIV