Как мне использовать один и тот же пакет NuGet для нескольких решений C #? - PullRequest
2 голосов
/ 26 апреля 2019

Я сейчас работаю с Newtonsoft.Json (a.k.a. Json.net), и несколько решений C # должны ссылаться на него. Кажется, наиболее удобный и широко используемый способ - установить Newtonsoft.Json с менеджером пакетов NuGet. Но я обнаружил, что пакет установлен в корневом каталоге решения (в любом случае, установка основана на данном решении), и его размером нельзя пренебречь (чуть более 10 МБ), поэтому мне интересно, есть ли элегантный способ поделиться этот пакет среди различных решений C #.

Я искал в Google и нашел несколько удовлетворительных результатов (возможно, это потому, что я не выразил свое требование должным образом); Единственный правильный ответ - создать папку .nuget как в каталоге, так и в решении, и заполнить его файлом NuGet.config следующим образом:

  1. Создайте папку .nuget в корне решения (фактически введя «.nuget.»)

  2. Внутри этой папки создайте файл NuGet.config.

  3. В Visual Studio 2015 щелкните правой кнопкой мыши решение и добавьте новый каталог решений с именем «.nuget»

  4. Щелкните правой кнопкой мыши по этой папке и выберите, чтобы добавить существующий файл, и выберите файл NuGet.config, созданный в (2).

  5. Добавьте содержимое в файл NuGet.config следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositoryPath" value="E:\JsonExamples\C#Examples\UseJsonInCSharp\packages" />
  </config>
</configuration>
  1. Перезапустите Visual Studio 2015.

Но это не сработало, потому что директива using

using Newtonsoft.Json;

до сих пор не распознан! Может быть, нужно сделать что-то еще, что мне не известно, но является здравым смыслом для ветеранов? Или, может быть, это потому, что версия Newtonsoft.Json слишком новая, чтобы это работало? Кто-нибудь может мне помочь? Большое спасибо!

Еще одно слово: в настоящее время я использую VS 2017, но я нашел только ответы, связанные с VS 2015, поэтому мне интересно, что предыдущий подход, если каким-то образом работает на VS 2015, когда-нибудь будет работать на VS 2017.

1 Ответ

0 голосов
/ 04 мая 2019

Давайте сначала проясним некоторые вещи о NuGet и ссылках в проектах:

  1. Работа в проекте заключается в том, чтобы сказать, какой внешний код должен смотреть этот проект - вы НЕ можете обойти это, вынеобходимо сделать ссылку на Newtonsoft.Json в каждом проекте, который вы хотите использовать.
  2. Работа NuGet заключается в том, чтобы загружать / восстанавливать nuget в какой-то папке - настройка по умолчанию «тупой» для старой предварительной NuGet 4версиями является создание отдельной папки пакетов в каждом решении.Давайте сосредоточимся на том, как сделать это умнее.

Вариант 1 (рекомендуется) - перенести все в PackageReference Он доступен начиная с NuGet 4 в VS 2017+ (я рекомендую по крайней мере VS 2017 15.7+, в котором есть мастер автоматической миграции со старых версий nuget).Это наиболее чистый способ ссылки на NuGets, поскольку PackageReference в проекте не жестко определяет местоположение загрузки NuGet.Вместо этого он оставляет это решение локальным настройкам NuGet.По умолчанию установлено значение «% USERPROFILE% \. Nuget \ packages».Ни один пакет nuget не дублируется, он действует как глобальный кэш для этого компьютера.Чтобы заставить все новые проекты использовать PackageReference по умолчанию, вы должны изменить NuGet.config, вот как: Стандартное управление пакетами для PackageReference

Вариант 2 - указать общее расположение NuGet для всех проектов в одном и том же хранилище Настройки конфигурации NuGet загружаются для каждого решения.Наличие общего конфигурационного файла для NuGet рекомендуется даже в том случае, если вы используете PackageReference, поскольку местоположение загрузки - это лишь один из многих параметров, которыми вы можете централизованно управлять для всех решений (другой популярный параметр - это настройка внешних репозиториев NuGet, которые вы хотите использовать).Настройка местоположения загрузки NuGet игнорируется новой PackageReference, поэтому ее можно безопасно использовать в сценарии смешивания.ОЧЕНЬ ВАЖНО, проекты, использующие этот старый NuGet, используют жестко запрограммированную ссылку на папку NuGet, поэтому каждый раз, когда вы меняете этот параметр местоположения NuGet, вы должны вручную исправлять все ссылки NuGet в каждом вашем проекте (редактируя файл .csproj вручную илиудаление и повторное добавление NuGets), поэтому выбирайте с умом и не меняйте. Подробная информация о том, как правильно установить глобальный NuGet.config: Итак, сначала позвольте мне объяснить, как работают общие параметры NuGet.config.NuGet сканирует все файлы NuGet.config из местоположения решения вверх по иерархии на корневой диск (он также проверяет все папки .nuget).Если обнаружено несколько конфигурационных файлов, выбирается тот, который ближе всего к решению.Например, у вас есть «C: \ Code \ Repository1 \ Project1 \ Solution1.sln».Если вы хотите иметь общие настройки NuGet для каждого решения в Repository1, поместите файл конфигурации в такое расположение, как «C: \ Code \ Repository1 \ NuGet.config».Также убедитесь, что это единственный файл конфигурации во всей папке Repository1.Следующий шаг - решить, где загрузить все пакеты, например, «C: \ Code \ Repository1 \ NuGetPackages».Чтобы все работало динамически на всех компьютерах, поместите относительный путь в NuGet.config следующим образом:

add key = "repositoryPath" value = "NuGetPackages"

...