【问题标题】:TFS Build failing since it seems to be looking in the wrong place for referencesTFS Build 失败,因为它似乎在错误的地方寻找参考资料
【发布时间】:2013-02-14 22:57:53
【问题描述】:

TFS (2012) Build 正在检查 C:\Windows\Microsoft.NET... 以获取我的一些项目引用,即使 dll 作为项目引用(设置为复制本地)包含在我正在检查的文件夹中在。

在 TFS 之外构建,无论是在 VS 中还是使用 MSBuild.exe 命令行都成功。

我可以在错误和警告中看到它抱怨的引用没有找到“无法解析此引用。找不到...'都是因为它根本没有签入 proj 文件中定义的签入依赖文件夹。

关于如何纠正这个问题的任何想法?

【问题讨论】:

  • 检查 a) 在您的 csproj 中设置的 ReferencePaths 和 b) 打开您的 msbuild 日志以进行诊断并检查此引用的来源。
  • 查看此帖子了解类似问题和解决方案:stackoverflow.com/questions/13463205/…
  • 您是否引用了特定的程序集版本?右键单击引用并选择属性确保“特定版本”标志为 True,默认为 False。

标签: c# tfs visual-studio-2012


【解决方案1】:

我相信 DotNet 依赖解析有一个“首先检查 gac”规则。

所以我这样做我的参考。

\MySolution.sln
\BALLayer\Biz.csproj
\DALLayer\Data.csproj
\PresLayer\MyWebsite.csproj
\ThirdPartyReferences\
\ThirdPartyReferences\SuperCoolDll111.dll
\ThirdPartyReferences\SuperCoolDll222.dll
\ThirdPartyReferences\SuperCoolDll333.dll

这样,所有 csprojects 都使用相对路径引用所需的 dll。 所有 cs 项目都引用相同的 dll。

这帮助我避免了“无论你想让我做什么,我都会查看 GAC”的问题。

Nuget 的做法与此类似。

\packages\
\packages\repositories.config
\packages\SomeLibrary\SomeDll.dll
\packages\SomeLibrary\MyNugetDll.dll

和 cs 项目使用相对路径引用相同的 .dll。

............

脚注: 在记事本中打开 .csproj 文件,然后查找 HintPath。 我的总是说类似

<Reference Include="MyNugetDll.dll>
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\SomeLibrary\MyNugetDll.dll</HintPath>
</Reference>

<Reference Include="SuperCoolDll333.dll>
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\ThirdPartyReferences\SuperCoolDll333.dll</HintPath>
</Reference>

…………

但我认为您问题的症结在于“复制本地”和“gac first”规则。

…………

PS

这是另一个讨论顺序的问题......比我做得更好。

In what order are locations searched to load referenced DLLs?

编辑::::

所以吸取了教训:

  1. 如果您将第三方引用签入源代码管理,并且构建机器显示“我找不到 xyz.dll”,那么请确保该 dll 实际上在源代码管理中。安装了 Visual Studio 的(本地开发)机器上有很多“巫毒”路径,随后将不在“构建机器”上。

  2. 如果您使用 nuget 并签入您的 dll,请确保它们都已签入。您可能会在 packages.config 中添加一个新条目,然后忘记将实际的 dll 放入源代码管理中.

  3. 有一些使用 nuget 的方法,您只需将 packages.config 放在源代码管理中,而不是第三方 dll。查看这篇文章的 cmets 以获取有关此的文章。

【讨论】:

  • 您好,感谢您的回答。我的提示路径设置类似。实际上,我相信 Nuget 已被使用,因为正如您在脚注中描述的那样,它们位于包配置中。也就是说,在 TFS 2012 上运行时,它们仍然没有被检查。如果有 gac first 规则,那么它是否应该不继续检查 proj 文件中的路径,如果它们没有首先在那里找到?
  • 好吧……这有点不同。我得把我的“本地构建如何获取文件~在 repositories.config 中定义”。等等。
  • blog.davidebbo.com/2011/03/… 我认为你需要一个命令来在你的构建脚本中“去获取 nuget 的东西”。
  • 非常感谢,但我不认为 N​​uget 获取是问题所在。所有 Nuget 包 dll 都与项目一起被检入。他们肯定在那里。我可以看到它们,只是构建系统没有在那里寻找它们。项目文件中的每个引用都有一个提示路径,如下所示: ..\packages\Microsoft.AspNet.Web.Optimization.1.0.0\lib\net40\ System.Web.Optimization.dll
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多