【问题标题】:NuGet packages getting installed to the wrong folderNuGet 包安装到错误的文件夹
【发布时间】:2019-08-05 19:28:28
【问题描述】:

我正在使用 Visual Studio 2017 中的 Xamarin.Forms PCL 移动应用程序,使用 project.json 进行包管理(我没有使用 PackageReference,因为为此需要 Visual Studio 2017,我们的一些团队正在仍在使用 Visual Studio 2015)。我在解决方案中有多个项目,并且我有多个项目分支,如下所示:

MobileApp/
    packages/ <<--- (I want nuget packages to be installed here)
    Branches/
        DevBranchSolution/
            MobileApp.sln
            nuget.config
            ProjectA/
            ProjectB/

我希望我的所有(项目/解决方案/分支)都能够从一个位置引用包,因此您会注意到我已在 MobileApp 文件夹的根级别添加了包文件夹。每个解决方案都有一个 nuget.config 文件,类似于:

nuget.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="..\..\packages" />
    </config>
    <packageSources>
        <clear />
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
        <add key="CustomPackagesLocation" value="..\..\packages" />
    </packageSources>
  <disabledPackageSources />
</configuration>

在 Visual Studio 中,当我右键单击解决方案时,单击“Manage NuGet Packages For Solution...”,然后安装一个包(例如 Newtonsoft.Json),我希望它会将这些包文件安装在我的MobileApp/packages/ 文件夹中,即我在解决方案的 nuget.config 中设置的位置。但事实并非如此。而是将文件放入全局 NuGet 包位置,即%USERPROFILE%\.nuget\packages

为什么?我的 nuget.config 文件不应该覆盖它吗?我已经验证,当我转到包管理器设置时,CustomPackagesLocation 的位置是正确的,但显然 repositoryPath 设置似乎没有任何影响。

我还注意到在 project.json.lockProject.nuget.targets 文件中,包文件夹设置为全局 NuGet 包位置(%USERPROFILE%/.nuget/packages 之一)。为什么?它是从哪里提取这个值的??

【问题讨论】:

  • 你的项目使用 PackageReferences 吗?
  • 我希望 - 不幸的是,并不是我们所有的团队都在使用 VS2015,所以我不想让 VS2017 成为必需品。我正在使用 project.json。
  • @jbyrd 你也可以在解决方案NuGet Config中设置全局包文件夹路径,那么你应该可以实现你想要的。
  • @jbyrd 抱歉忘记发布密钥。关键是 globalPackagesFolder
  • @imps - 是的,就是这样 - 这里的主要内容是:使用 packages.config 的项目使用 repositoryPath,而其他项目(使用 project.json 和使用 PackageReferences 的项目)使用globalPackagesFolder.

标签: visual-studio xamarin.forms nuget visual-studio-2017 nuget-package


【解决方案1】:

为什么?它是从哪里提取这个值的??

Project.json 文件的默认包目录是%USERPROFILE%/.nuget/packagesproject.json 项目现在不支持repositoryPath 配置。这就是您更改了 repositoryPath,但 NuGet 仍将包放入全局 NuGet 包位置的原因。可以参考 GitHub 上的same issue

如果您想更改 project.json 的软件包默认位置,您可以设置“NUGET_PACKAGES”环境变量。只需设置“NUGET_PACKAGES”=“....\packages”。或者,您可以在解决方案旁边放置一个 NuGet.Config 文件,其中包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <config>
      <add key="globalPackagesFolder" value="..\..\packages" />
    </config>
 </configuration>

有关配置部分的详细信息,请参阅NuGet.Config reference

【讨论】:

  • 谢谢!是的,这是我在收到@MattWard 的提示后发现的。我花了很长时间才找到这个简单的事实(只有 packages.config 项目使用 repositoryPath,而其他项目使用 globalPackagesFolder)。也许如果我更仔细地阅读了 nuget.config 文档,我会注意到这一点;但是这些事实都在括号中并且格式很奇怪 - 在一个细表列中,因此它可以减少到 3 行并且更容易跳过)。
【解决方案2】:

我有一个非常相似的问题,它没有将包文件夹用于类库。出于某种原因,我的 csproj 文件设置了一些程序集。我删除了这一行并做了一个 update-package -reinstall -project myclasslibrary 并且它再次工作得很好。

我不确定一开始是什么设置了 HintPath。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多