использование командной строки 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. и мой файл packages.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).

спасибо


person user1746773    schedule 19.06.2013    source источник
comment
Я создал проблему на nuget.codeplex.com, которая не является вашей точной проблемой, но также может решить ее, используя немного другой рабочий процесс: nuget.codeplex.com/workitem/4258   -  person theDmi    schedule 15.08.2014


Ответы (1)


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

Если вы посмотрите на исходный код, вы увидите, что nuget.exe устанавливает 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

person ferventcoder    schedule 26.06.2013