Когда я узнал, создал ли Крис Б проблему NuGet для этого, я не смог ее найти. РЕДАКТИРОВАТЬ: Он сделал, см. Его комментарий ниже. Но я нашел полудокументированную функцию NuGet, которую использовал для решения этой проблемы: Разрешить указывать папку, в которую устанавливаются пакеты
Позвольте мне разбить этот вопрос на 2 вопроса:
- получение NuGet, позволяющим нескольким решениям использовать одно и то же местоположение пакетов
- автоматическое получение пакетов NuGet из системы управления исходным кодом при включении проекта с пакетами NuGet
Проблема 1:
По умолчанию NuGet хранит пакеты в папке пакетов в папке решения. Чтобы изменить это местоположение, создайте файл nuget.config в корневой папке решения со следующим содержимым:
<settings>
<repositoryPath>..\..\..\Utilities\Library\nuget.packages</repositoryPath>
</settings>
<repositoryPath>
относительно вашего решения; так очевидно сделай это как хочешь. Сделайте так, чтобы у каждого решения был свой относительный путь к той же папке пакетов.
Что касается потока NuGet, то с этой точки пути в repositories.config относятся к папке, содержащей repositories.config, а не к решению, поэтому теперь все проекты / пакеты управляются независимо от местоположения решения.
Это позволяет нескольким решениям использовать одни и те же пакеты в управлении исходным кодом, и если эти решения используют одни и те же проекты (использующие пакеты NuGet), все эти решения / проекты будут синхронизироваться независимо от того, какое решение обновляет пакет.
Проблема 1 полностью решена.
Задача 2:
Позвольте мне рассмотреть это с двух точек зрения. Это относится и к Visual Studio, и к TFS - я оставлю SVN кому-то другому по адресу.
Во-первых: если у вас нет исходного кода на вашем диске и вы получаете решение (не проект), я предпочитаю сделать так, чтобы вы получили все, что нужно для построения решения. Там не должно быть никаких пропущенных ссылок, чтобы перейти вручную. Это можно сделать, добавив файлы пакета в качестве элементов решения. Да, в каждом решении. Да, немного работы, но когда это будет сделано, файлы пакета будут автоматически извлекаться / обновляться из системы контроля версий.
Второе: в новом решении, когда вы включаете существующий проект управления исходным кодом, в котором есть пакеты NuGet, вы должны вручную извлечь пакеты из управления исходным кодом и добавить их в качестве элементов решения. По крайней мере, любой, кто получит ваше решение в будущем, автоматически получит все необходимое для успешного создания. По крайней мере, с VS / TFS, это просто так, AFAIK. Если projB зависит от projA, и вы добавляете projB в новое решение, VS / TFS не будет автоматически захватывать projA из TFS. Вы должны сделать это вручную. То же самое относится и к ссылкам на dll (например, к пакетам NuGet).
Краткое описание моего решения:
- Только одна копия пакетов в системе контроля версий для всех решений
- Любое решение может обновлять пакеты, а все остальные решения будут синхронизированы *
* Как только одно решение обновит пакеты до новых путей или имен файлов, они будут отображаться как отсутствующие ссылки на другие решения, и вам придется вручную их очистить. Но, по крайней мере, вы точно знаете, где пакеты находятся в управлении исходным кодом "(в отличие от расположения RandomSolution \ packages)."