Используя командную строку 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