TeamCity-MSBuild无法找到NuGet引用

TeamCity-MSBuild无法找到NuGet引用,msbuild,teamcity,nuget,Msbuild,Teamcity,Nuget,在TeamCity中,尝试构建一个在NuGet包中有大量程序集引用的C#项目失败,但在VisualStudio中效果良好 在日志中找到 For SearchPath "{HintPathFromItem}". [13:48:15][ResolveAssemblyReference] Considered "..\packages\AspNetMvc.4.0.20126.16343\lib\net40\System.Web.Mvc.dll", but it didn't exi

在TeamCity中,尝试构建一个在NuGet包中有大量程序集引用的C#项目失败,但在VisualStudio中效果良好

在日志中找到

For SearchPath "{HintPathFromItem}".

[13:48:15][ResolveAssemblyReference]         
Considered "..\packages\AspNetMvc.4.0.20126.16343\lib\net40\System.Web.Mvc.dll", but it didn't exist.
项目文件中的参考是:

<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>..\packages\AspNetMvc.4.0.20126.16343\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>

真的
..\packages\AspNetMvc.4.0.20126.16343\lib\net40\System.Web.Mvc.dll

有什么想法吗?它似乎不是从正确的目录开始的,因此无法解析存在于.csproj文件上方一级的“./packages”。

您需要将packages目录添加到源代码管理中,或者启用nuget自动下载包(这是nuget 1.6右键单击菜单中的一项功能)


请参见

您可以在解决方案资源管理器中突出显示该文件并转到属性,并验证
复制到输出目录
是否设置为
True
自从安装NuGet软件包以来,我已重新构造了我的项目,因此即使“../packages”对于主项目是正确的,这不是为了其他已经被转移的项目


卸载和重新安装NuGet软件包会正确或更直接地写入路径,对每个.csproj文件中的路径进行查找和替换

我对这一点的理解基于以下信息:

但我只是同时潜入TeamCity和NuGet(来自CruiseControl.NET)


因此,我目前所做的是在我的vs.net解决方案构建步骤之前添加一个“NuGet Installer”构建步骤,一切都很顺利。

我知道这已经得到了回答,但可能其他人也遇到了与我相同的问题

我的项目文件中的提示路径错误地指向包,并将其更改为..packages为我修复了它

因此,将其更改为:

<Reference Include="Newtonsoft.Json">
  <HintPath>packages\Newtonsoft.Json.5.0.5\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference>

packages\Newtonsoft.Json.5.0.5\lib\net40\Newtonsoft.Json.dll
为此:

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.5\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference>

..\packages\Newtonsoft.Json.5.0.5\lib\net40\Newtonsoft.Json.dll

修复了它。

很抱歉恢复了这篇旧帖子,但是除了上面的优点(Tjaart,SeeNoWeevil,Luke),您可能还需要检查属性
CopyLocal=true
,查看您删除的引用

对我来说,这常常是一个小小的疏忽,导致OP提到的错误。

确保.dll和.pdb文件包含在源代码管理中(或已下载)。 对于TFS(非TeamCity),默认情况下,
.pdb
文件和
.dll
文件被排除在外。因此,请仔细检查每个包子目录的所有文件是否都包含在内,而不仅仅是nuget
.xml
文件

背景:我和其他一些海报一样想到了这个问题,
.csproj
文件中的相对引用可能不正确。在使用.csproj文件中的路径以确保对项目的引用是绝对的之后。。。
$(MSBuildProjectDirectory)\..\.nuget\packages\Common.Logging.Core.3.0.0\lib\net40\Common.Logging.Core.dll

…只是为了得到相同的错误,我再次检查了所需的文件是否存在。我还在本地计算机上构建了一个MSBuild(与VisualStudio构建相反),它运行正常。对生成服务器的进一步调查显示,指定的文件不存在,即使目录和.nuget package
.xml
文件存在。

包文件夹受源代码管理,并存在于TC的工作目录中。这纯粹是为了部署,对吗?TC无法实际生成项目,因为MSBuild无法在编译期间访问引用的程序集(不在GAC中)@thecapsacinkid-AFAIK生成期间发生此情况。这似乎是MSBuild问题,我刚刚从命令行运行了它,它无法找到带有..\packages\etcIf的程序集
CopyLocal=true
是正确的设置,那么它是如何变成
false
?这对我来说也是一个谜,但由于NUGET通常不是GAC'd,没有CopyLocal=true,您不会走得太远。可能是因为一个不好的nuget包?一般来说,不建议签入DLL/PDB之类的构建工件。@Matt大体上,我同意。但是,NuGet包本质上是第三方依赖项,基于NuGet结构,它是构建项目所需引用的一部分。将这些包含在源代码管理中的理由是,对于许多NuGet软件包,源代码是不提供的,因此这些二进制文件形成了构建代码所必需的外部依赖项,因此应该与代码一起保存。(考虑一下当互联网不可用时,如果没有NuGet软件包,代码将无法构建)。