Используя командную строку nuget.exe для установки зависимости

Я хочу использовать nuget.exe(версия 2.5) в конвейере сборки CI для установки пакета, который имеет зависимость от другого пакета.

У меня есть следующий файл nuspec.

<?xml version="1.0"?>
<package>
  <metadata>
    <id>A</id>
    <dependencies>
      <dependency id="B" version="1.0.0.1" />
    </dependencies>
  </metadata>
  <files>
    <file src="A.dll" target="lib" />
  </files>
</package>

и аналогичные для B. и мой файл package.config, который я использовал для установки, это:

<packages>
  <package id="A" version="1.0.0.1" allowedVersions="[1,2)"/>
</packages>

и я запускаю следующую команду:

NuGet.exe install packages.config -ExcludeVersion -Outputdir libs -source http://get.nuget.mydomain

Я получаю вывод:

Successfully installed 'A 1.0.0.1'.

но не установите мою зависимость B.

Но если поместить B отдельно в файл packages.config, я получаю установку A и B. Я ожидал, что B будет установлен при установке A, поскольку это зависимость от A. Мы не помещаем DLL в GAC (так что я считаю, что разрешение зависимостей не должно быть проблемой). Также я открыл A.nupkg и проверил, что есть указанная там зависимость. Также, когда я устанавливаю A из, в Visual Studio редактор B также устанавливается. (Что и должно произойти).

Как использовать nuget.exe и установить зависимость B, когда я устанавливаю только A (поместите A только в packages.config).

спасибо

Ответы

Ответ 1

Это невозможно. Поведение файла packages.config по дизайну. Установлены только те вещи, которые указаны в файле packages.config, а не их зависимости. Все зависимости также должны быть явно указаны.

Если вы посмотрите на исходный код, вы увидите, что nuget.exe install packages.config(http://nuget.codeplex.com/SourceControl/latest#src/CommandLine/Commands/InstallCommand.cs) использует PackageExtractor.InstallPackage(http://nuget.codeplex.com/SourceControl/latest#src/CommandLine/Common/PackageExtractor.cs):

public static void InstallPackage(IPackageManager packageManager, IPackage package)
    {
        var uniqueToken = GenerateUniqueToken(packageManager, package.Id, package.Version);
        // Prerelease flag does not matter since we already have the package to install and we ignore dependencies.
        ExecuteLocked(uniqueToken, () => packageManager.InstallPackage(package, ignoreDependencies: true, allowPrereleaseVersions: true));
    }

Обратите внимание на жесткий вызов ignoreDependencies: true