17

我想在我的 CI 构建管道中使用 nuget.exe(2.5 版)来安装一个依赖于另一个包的包。

我有以下 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。我希望在安装 A 时安装 B,因为它是 A 的依赖项。我们没有将 dll 放入 GAC(所以我相信依赖项解析应该不是问题)。另外我打开了 A.nupkg 并检查了它是否有那里列出的依赖项。此外,当我在 Visual Studio 编辑器中安装 A 时,B 也会被安装。(这是应该发生的)。

当我只安装 A 时,如何使用 nuget.exe 并安装依赖项 B(仅将 A 放在 packages.config 中)。

谢谢

4

1 回答 1

7

这是不可能的。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

于 2013-06-26T21:18:57.290 回答