Nu-Get & проблема с зависимостями уровня проекта для проектов, на которые ссылаются несколько решений - PullRequest
17 голосов
/ 08 июня 2011

Я пытаюсь выяснить, как лучше всего справиться с этим сценарием.

Допустим, у меня есть библиотека, на которую ссылаются несколько разных несвязанных решений, назовем ее WebServiceInterface.dll. Эта библиотека зависит от JSON.NET.

До NuGet

На двоичный файл JSON.NET ссылался внешний SVN в проекте WebServiceInterface. Другие решения, которые зависели от WebServiceInterface, ссылались на проект (также как внешний SVN) и в результате извлекали как проект, так и его зависимости.

с NuGet

Я не понял, как заставить ссылку JSON.NET храниться в проекте WebServiceInterface (в отличие от местоположения RandomSolution \ packages). Я нашел ссылку @ nu-get на pakakges уровня проекта и уровня решения, но я не могу понять, как это указать, когда я добавляю зависимость через nu-get.

Целью здесь является то, что когда кто-то проверяет WebServiceInterface и добавляет его в новое решение, которое оно создает (вместо того, чтобы иметь неработающие ссылки на JSON.NET, которые указывают на каталог пакетов в любом последнем решении, которое было зарегистрировано).

Ответы [ 2 ]

23 голосов
/ 27 октября 2011

Когда я узнал, создал ли Крис Б проблему NuGet для этого, я не смог ее найти. РЕДАКТИРОВАТЬ: Он сделал, см. Его комментарий ниже. Но я нашел полудокументированную функцию NuGet, которую использовал для решения этой проблемы: Разрешить указывать папку, в которую устанавливаются пакеты

Позвольте мне разбить этот вопрос на 2 вопроса:

  1. получение NuGet, позволяющим нескольким решениям использовать одно и то же местоположение пакетов
  2. автоматическое получение пакетов 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)."

4 голосов
/ 19 июня 2011

Пакеты всегда хранятся на уровне решения, поэтому, если вы устанавливаете пакет в несколько проектов, они приходят из одного места.Я не верю, что вы можете настроить его так, чтобы у каждого проекта была своя папка пакетов.

Я не уверен, что есть хороший способ сделать то, что вы пытаетесь.Возможно, у вас есть шаг сборки для проекта, который выбирает пакет, но я не знаю, насколько хорошо это вам подойдет.

Я бы рекомендовал опубликовать в NuGet Issue Tracker , чтобы начать обсуждение.Люди, работающие над этим, кажутся довольно активными, поэтому они могут добавить поддержку в будущей версии: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...