【问题标题】:TeamCity - MSBuild unable to locate NuGet referencesTeamCity - MSBuild 无法找到 NuGet 引用
【发布时间】:2012-03-16 09:15:33
【问题描述】:

尝试在 TeamCity 中构建一个对 NuGet 包中的程序集有大量引用的 C# 项目失败,但在 Visual Studio 中工作正常。

在日志中找到;

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>

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

【问题讨论】:

  • 这似乎是一个 MSBuild 问题,我刚刚从命令行运行它,它无法找到 为 ..\packages\etc 的程序集

标签: msbuild teamcity nuget


【解决方案1】:

我知道这已得到解答,但也许其他人也遇到了与我相同的问题。

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

所以从这里改变它:

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

到这里:

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

修复它。

【讨论】:

    【解决方案2】:

    自从安装 NuGet 包以来,我已经重新构建了我的项目,因此即使“../packages”对于主项目是正确的,但它不适用于已移动的其他项目。

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

    【讨论】:

      【解决方案3】:

      我此时的理解是基于这里的信息:http://youtrack.jetbrains.com/issue/TW-20525

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

      所以我暂时做的是在我的 vs.net 解决方案构建步骤之前添加一个“NuGet Installer”构建步骤,一切都很好。

      【讨论】:

        【解决方案4】:

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

        http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

        【讨论】:

        • 包文件夹在源代码管理下,并存在于 TC 的工作目录中。
        【解决方案5】:

        很抱歉恢复了这篇旧帖子,但除了上述优秀点(Tjaart、SeeNoWeevil、Luke)之外,您可能还想查看属性CopyLocal=true 以获取您删除的参考资料。

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

        【讨论】:

        • 如果CopyLocal=true是正确的设置,那么它是如何变成false的?
        • 这对我来说也确实是个谜,但由于 nuget 通常不是 GAC 的,所以如果没有 copylocal=true,你不会走得太远。可能是因为 nuget 包不好?
        【解决方案6】:

        您可以在解决方案资源管理器中突出显示该文件并进入属性,然后验证 Copy to Output Directory 是否设置为 True

        【讨论】:

        • 这纯粹是为了部署,对吧? TC 无法真正构建项目,因为 MSBuild 在编译期间(不在 GAC 中)无法访问引用的程序集
        • @thecapsaicinkid - AFAIK 它发生在构建过程中。
        【解决方案7】:

        确保 .dll 和 .pdb 文件包含在源代码管理中(或已下载)。

        对于 TFS(不是 TeamCity),默认情况下会排除 .pdb 文件和 .dll 文件。因此,请仔细检查每个包子目录的所有文件是否已包含在内,而不仅仅是 nuget .xml 文件。

        背景:我提出这个问题的想法与其他一些海报相同 - .csproj 文件中的相对引用可能不正确。在 .csproj 文件中使用路径以确保引用对于项目而言是绝对的... &lt;HintPath&gt;$(MSBuildProjectDirectory)\..\.nuget\packages\Common.Logging.Core.3.0.0\lib\net40\Common.Logging.Core.dll&lt;/HintPath&gt; ..只是为了得到同样的错误,我仔细检查了所需的文件是否存在。我还在我的本地机器上做了一个 MSBuild 构建(与 Visual Studio 构建相反),它工作正常。对构建服务器的进一步调查显示,指定的文件不存在,尽管目录和 .nuget 包 .xml 文件存在。

        【讨论】:

        • 一般意义上,不建议签入 DLL/PDB 等构建工件。
        • @Matt 总的来说,我同意。但是,NuGet 包本质上是第 3 方依赖项,它们基于 NuGet 结构,是构建项目所需的引用的一部分。将这些包含在源代码控制中的理由是,对于许多 NuGet 包,没有提供源代码,因此这些二进制文件形成了构建代码所必需的外部依赖项,因此应该与代码一起保存。 (考虑互联网不可用的情况,如果没有 NuGet 包,代码将无法构建)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        相关资源
        最近更新 更多