为什么Visual Studio在尝试使用NuGet包构建解决方案时会拒绝访问,代码5错误



我正在尝试构建一个引用NuGet包的Visual Studio解决方案。我已经从别人的计算机上复制了解决方案(通过Git,但我不知道复制的方式在这里是否重要)。当我试图构建解决方案时,我一直收到这个命令:

Error 3 The command ""D:Custom WorkMySolutionProject.nugetnuget.exe" install
"D:Custom WorkMySolutionProjectAAIA.Modelpackages.config" -source ""
-RequireConsent -o "D:Custom WorkMySolutionProjectpackages"" exited with code 5.
Please verify that you have sufficient rights to run this command.

我已经检查了所有文件夹的权限,它们似乎都很好。也没有共享违规行为;Visual Studio 2010是唯一一个接触这些文件和文件夹的程序。为什么会发生这种情况?

您的克隆解决方案可能没有传入nuget.exe文件的windows"执行"权限。

如果您在cygwin中使用git clone进行克隆,然后尝试使用visual studio打开和构建,则nuget.exe的权限将没有正确设置。它的"linux"不支持windows的可执行权限。如果你使用git扩展之类的东西进行克隆,你可以避免这个问题,因为它是为windows构建的,并且支持可执行权限。

或者在我的情况下,<solution root>.nugetnuget.exe文件已损坏。

  1. 删除<solution root>.nugetnuget.exe文件
  2. (re)启用NuGet包还原(VS2012 menu=>"project"=>启用NuGet包还原)

可执行位问题与Cygwin、Linux或其他无关。

所有你需要知道的理论

Windows和Linux(以及所有Unixen)都有一个可执行程序文件的概念,这些文件在文件系统上被标记为可执行程序。git在工作空间上签出树时,会将其Blob写入文件,并根据存储在树对象中的"模式"设置其权限。

"模式"基于Unix模式,但更为有限,可能是为了便于移植(只有三种模式:普通文件、可执行文件和符号链接)。Windows实现使用它来相应地设置NTFS文件权限不会有任何问题。

故事到此结束。可执行文件在git存储库中被标记为可执行文件,并在所有用户系统上自动设置。

Visual Studio怪癖

然而,VS团队显然决定自动将一些(所有?)新签出的文件设置为可执行文件,即使它们在存储库中没有标记为可执行。理论上听起来不错,很多人忘记或不太理解"权限"的概念。

我说"显然"是因为它似乎与继承的权限有关。这可能是因为他们没有真正的意图,而是忘记了自己设置适当的权限

在实践中,这意味着甚至更多的人忘记并保持遗忘,只要他们都专门使用Visual Studio来操作存储库。那些使用任何其他工具(包括官方git命令)的人将无法开箱即用地执行程序,并且会被错误地告知使用Visual Studio,而不是在存储库中将文件标记为可执行文件。

相反,当使用VS将文件从存储库中检出时,似乎没有办法将文件自动设置为可执行文件。

有一些巫毒会阻止git在以这种方式设置时检测实际权限。这可能与权限继承和特殊权限有关。使用文件资源管理器的文件属性的安全窗格以及git的源代码,您可能能够确定这是一个功能还是一个bug。(IMO,这一点没有意义,因为我认为工作空间中的权限应该与存储库中的权限相匹配,他们在使用官方git命令时会这样做。)

手动操作权限

使用Windows的文件资源管理器,使用文件属性窗口及其安全窗格。使用Cygwin或任何其他Unix-y环境,使用chmod

Visual Studio用户的真正解决方案

chmod +x .nuget/NuGet.exe

(或者,使用文件资源管理器以git检测到的方式正确设置可执行权限——就像chmod所做的那样。)

git应该检测到更改并将其解释为模式更改。git diff产量:

diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe
old mode 100644
new mode 100755

现在提交并将其向上游推送,这样其他人就不必这么做了。

将来,试着使用官方的git clone命令,或者更好地研究它,以便向能够以理智的方式修复它的人编写一份适当的错误报告。可能双方都有事情要做(git可能需要更聪明地处理Windows上的继承权限,Visual Studio在签出时可能需要更小心地设置这些权限)。

确保您的.nugetnuget.exe文件具有可执行权限。通过复制,您可能已经更改了所有权或权限。

这里拒绝访问NuGet的是Visual Studio配置设置。

  1. 在VS中,转到工具>选项
  2. 向下滚动到Package Manager节点
  3. 请确保选中"允许NuGet在生成过程中下载丢失的包">
  4. 单击"确定">
  5. 尝试重新构建解决方案

最新更新