我想在我的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时安装A,因为它是A的依赖。
我们不把dll放在GAC中(所以我认为依赖解决不应该是一个问题)。而且我已经打开了A.nupkg并检查是否有依赖列表。
另外当我在visual studio编辑器中安装A时,B也被安装了(这是应该发生的)。
当我安装A时,如何使用nuget.exe和安装依赖项B(仅将A放在packages.config中)。
谢谢
这不可能。 package.config文件的行为是设计的。只有在package.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