Команда Multiperson, использующая NuGet и Source Control

Am в команде из двух человек, использующей Team Foundation Server для нашего исходного контроля. Я начал новое решение. Для этого решения я создал несколько проектов. Во многих из них я использовал NuGet для установки AutoMapper и Unity. Затем я щелкнул правой кнопкой мыши по решению и выбрал "Добавить в исходное управление". Затем я проверил полученные ожидающие изменения.

Другой человек в моей команде сделал последнее, и все ссылки NuGet терпят неудачу для него.

Итак, я решил, что мне нужно добавить Пакет Пакетов. Поэтому я сделал это.

После этого ссылки NuGet все еще терпят неудачу (для него).

Кроме того, когда я пытаюсь добавить пакет NuGet в файл, я получаю эту ошибку:

Доступ к пути 'C:\src\MyPath\ToMySolution\packages\repositories.config' отклоняется.

Я предполагаю, что это происходит из-за того, что файл repositories.config теперь находится под контролем источника (поэтому он считывается только до тех пор, пока не будет извлечен вручную).

Итак, вот мои два вопроса:

  • Как или что я могу проверить, чтобы пакеты NuGet были действительны для моего сотрудника, когда он получает последнюю версию?
  • Есть ли способ не вручную проверять файлы NuGet, когда мне нужно использовать NuGet?

Я делаю это неправильно? или NuGet не предназначен для использования с Source Control?

Ответы

Ответ 1

Редактировать 2014/03/31: Руководство по восстановлению пакета на базе MSBuild больше не требуется, см. также http://xavierdecoster.com/migrate-away-from-msbuild-based-nuget-package-restore.

Изменить 2012/02/07: теперь это встроенная функция NuGet vsix, называемая Enable Package Restore.

Устаревшая альтернатива

Для этого есть пакет NuGet, он называется NuGetPowerTools. Он добавляет две новые команды в консоль диспетчера пакетов NuGet в Visual Studio, среди которых для вас интересна Enable-PackageRestore.

Он добавит папку .nuget, содержащую nuget.exe, nuget.settings.targets и nuget.targets. При запуске разрешить восстановление пакета он перечислит все проекты в вашем решении и добавит в файл проекта файл import nuget.targets(которые сами являются файлами msbuild).

Всякий раз, когда вы создаете проект или все решение, nuget будет извлекать все пакеты для этого проекта/решения, как определено в файле packages.config. Это происходит на этапе предварительной сборки.

Итак, короче:

  • не регистрировать пакеты
  • выполните проверку файлов конфигурации (файлы repositories.config и packages.config)
  • использовать Включить восстановление пакетов
  • зарегистрировать папку .nuget

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

Кроме того, когда пакеты не передаются в TFS Source Control, вы не будете удалять ошибки только для чтения или слить конфликты с двоичными файлами.

Если вы хотите, вы также можете проверить основы для этого подхода в моем блоге.

Ответ 2

Не проверяйте папку пакетов.

Добавьте в проект следующее событие предварительной сборки:

$(SolutionDir)build\nuget install $(ProjectDir)packages.config -source \\server\path\NuGetPackages -o $(SolutionDir)packages

Параметр Omit -source, если не использует пользовательские пакеты.

nuget.exe проверяется на $(SolutionDir) build\nuget

Ответ 3

Я всегда проверяю только папку packages.config и использую команду rake, которую разработчик (и сервер сборки) может использовать для локального обновления пакетов.

Задача выглядит так:

def nuget_for_project(project_dir)
  sh "tools\\NuGet.exe " +
    "i Source\\#{project_dir}\\packages.config " +
    "-o Source\\Packages"
end

namespace :nuget do
  desc "nuget for servicebus"
  task "ServiceBus" do
    nuget_for_project "SampleProject.ServiceBus"
  end    

  desc "nuget for web"
  task "Web" do
    nuget_for_project "SampleProject.Web"
  end  

  desc "nuget for all"
  task "all" => ["nuget:ServiceBus", "nuget:Web"]
end

Обратите внимание, что приведенный выше script использует локальную версию NuGet.exe, которая находится в папке с инструментами, проверенной в исходном элементе управления.

Вы можете написать это для msbuild или nant вместо.

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

Ответ 4

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

Итак, я поместил папку своих пакетов в исходный код.

Мое решение включить Nuget в этом случае состояло в том, чтобы обратить внимание на это сверху:

"Я предполагаю, что это связано с тем, что файл repositories.config теперь находится под контролем источника (поэтому он читается только до тех пор, пока не будет вручную извлечен).

Я открыл файл repositories.config и добавил пустую строку. Затем добавили пакеты Nuget, которые мне нужны. Проблема решена.

Ответ 5

Должен дать крик в этой статье: http://www.jsinh.in/2013/11/enable-nuget-package-restore/ В нем точно описывается, что делать и почему.

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

Редко, но возможно.

Например, пакет "abc.package" версии 2.0.2 встроен в ваш проект. Вы не используете версию abc.package, но делаете версию package.config. Несколько месяцев спустя вам нужно добавить исправление ошибок в сборку, которую вы сделали несколько месяцев назад. Вы получаете предметы из VC. VisualStudio загружает версию 2.0.2 "abc.package", но с момента последней сборки разработчик пакета вставил или исправил некоторый код. Этот новый код может вести себя по-другому в вашем приложении.

Итак, для VC есть веские причины!

Ответ 6

На всякий случай это помогает любому, мое решение для этого было очень простым:

  • Открытый целевой файл в NP ++
  • В меню редактирования, полностью в нижней части, нажмите Clear Read-Only Flag
  • Сохранить файл
  • Profit

Это работает для меня с решением, которое на момент написания этой статьи 39 проектов.