如何为Visual Studio项目禁用“传递式包管理”

4

如何禁用“传递式包管理”?

我希望这样做,以便我可以安装一个本地“打包”到.nupkg文件中的程序包。当我尝试这样做时,会出现以下消息提示:对于基于传递式包管理的项目{csproj文件},“源”参数无效。将使用NuGet配置中已启用的源。

完整上下文

在开发尚未准备通过我们的NuGet feed进行分发的NuGet程序包时,我经常从包管理器控制台创建本地的.nupkg文件,方法如下:

nuget pack {path-to-csproj-file}

这将生成一个{project-name}.nupkg文件,然后我可以通过在Visual Studio中打开它并导航到包管理器控制台,输入以下命令来在另一个项目中安装它:

Install-Package {path-to-nupkg-file}

这一方法很有效,在NuGet软件包准备好分发后,我们将其上传到Azure DevOps并让构建流水线将其推送到我们的源中。
然而,最近我继承了一个项目,之前的开发人员显然设置了“传递式软件包管理”,这阻止了这种工作流程。当我尝试直接从.nupkg文件安装时,会出现以下情况:
Install-Package C:\Users\Josh\source\repos\SpeakerDiscountManager\SpeakerDiscountData.1.0.5.nupkg
The 'Source' parameter is not respected for the transitive package management based project(s) MembershipApplicationWidget\MembershipApplicationWidget.csproj. The enabled sources in your NuGet configuration will be used. 
<snipped several lines of unsuccessfully searching configured package sources>
Install-Package : NU1102: Unable to find package SpeakerDiscountData with version (>= 1.0.5)

显然,它没有找到我通过文件指定的包,因为它正在搜索在线源,而且它不存在于我们任何在线软件包源中——该包处于测试状态,还没有准备好供其他人使用。

根据错误消息,我需要关闭“传递式包管理”,以便我可以为该包指定一个文件源,但是我在网上找不到关于如何配置这个的任何信息。

我尝试在另一个项目中安装这个完全相同的.nupkg文件,使用相同的Install-Package {path-to-nupkg-file}过程。这个方法有效。


作为一种解决方法,我已经添加了一个本地软件包源,指向一个目录,我在其中放置了我的.nupkg文件。但我仍然想知道如何恢复我在其他每个项目中都有的行为,即“Install-Package {path-to-nupkg-file}”将安装NuGet软件包。 - Josh
2个回答

4
如何为Visual Studio项目禁用“传递式包管理”
我认为这个问题“传递式包管理”与您当前的项目结构有关,其中存在一些复杂的依赖关系、自定义规则等。因此,关闭“传递式包管理”是不切实际的。如果您创建其他项目,然后按照您的方式安装此软件包,我认为它可能不会发生。
作为最佳解决方法,正如您所说(从消息“在您的NuGet配置中启用的源将被使用。”中得到提示),将本地Nuget包的路径添加到Nuget包源中。
在您的方面,我认为您可以在包管理器控制台中指定“-Source xxxxx(Nuget包的路径)”来安装此软件包,如果是这样,这个功能实际上是不方便的。
您只需将SpeakerDiscountData.1.0.5.nupkg存在的文件夹路径添加到全局Nuget包源中。完成后,它将适用于此计算机中的任何项目。

它有两种方式:

1) VS IDE UI

工具-->选项-->NuGet 包管理器-->包源-->添加新键并输入 nuget 文件夹的路径。还要勾选其选项。

2) 全局 NuGet.Config 文件

(C:\Users\xxxx\AppData\Roaming\NuGet\Nuget.Config步骤 1 只需通过 VS UI 控件将路径添加到此文件中)

添加这些:

<packageSources>
    <add key="Local Packages Source" value="C:\Users\Josh\source\repos\SpeakerDiscountManager\" />
..........
</packageSources>

在此之后,您可以使用命令来安装此nuget包。
注意:如果您的解决方案的根目录还有一个名为nuget.config的文件,则其中的参数将覆盖全局文件。它具有最高优先级。

enter image description here


谢谢,佩里。这实际上是我已经实施的解决方法。不过,我仍然有兴趣了解如何禁用传递性包管理。 - Josh
为了关闭传递性包管理,我建议您可以尝试此链接的解决方案 - LoLance

1

只需前往Vs IDE Tools/Nuget Package Manager/Package Manager Setting并检查软件包源地址。 它类似于“C:\Program Files (x86)\Microsoft SDKs\NuGetPackages”。 然后将您的软件包文件复制到该文件夹中,最后在Package Manager Console中运行以下命令: install-package packagename


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接