我猜测问题是关于被提取但未正确放置的包.透过痛苦无聊的日志给我看这个.
2016-01-15T21:50:40.8680146Z
The target “BeforeGenerateProjectPriFile” listed in a BeforeTargets attribute at “C:\Program Files (x86)\MSBuild\Microsoft\NuGet\Microsoft.NuGet.targets (186,61)” does not exist in the project,and will be ignored.
此后不久,我可以看到一些横向发生的迹象.
2016-01-15T21:50:43.9631666Z ##[warning]
C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1819,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly “Microsoft.CodeDom.Providers.DotNetCompilerPlatform,Version=1.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL”. Check to make sure the assembly exists on disk. If this reference is required by your code,you may get compilation errors.
2016-01-15T21:50:43.9631666Z 2>
C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1819,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly “Microsoft.CodeDom.Providers.DotNetCompilerPlatform,you may get compilation errors. [C:\a\1\s\MyStuff\MyStuff.csproj]
然后它继续考虑那些不存在的东西.
2016-01-15T21:50:43.9661661Z
Considered “..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll”,but it didn’t exist.
2016-01-15T21:50:43.9671655Z
For SearchPath “{TargetFrameworkDirectory}”.
2016-01-15T21:50:43.9681655Z
Considered “C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.2\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.winmd”,but it didn’t exist.
…
我不熟悉TFS上的CI,也不熟悉VS Online,因此它很少告诉我在哪里可以解决这个问题.我用谷歌搜索了一半,并在门户网站上测试了大量不同的设置.没运气.我可能会导致其他错误(当我知道我输入了错误的东西等等)但是不管怎么说,我都会转向这个错误.
任何提示将不胜感激.
解决方法
首先,验证您的构建实际上是否还原了包.我注意到在错误日志中,它看起来如果确实如此,但这是一个陷阱.这是尝试恢复,而不是实际的成功.如果你遇到这样的警告(同样适用于nUnit,WebGrease,NewtonSoft或NuGet控制下的任何其他软件包):
Warning MSB3245: Could not resolve this reference. Could not locate the assembly “EntityFramework”. Check to make sure the assembly exists on disk.
首先验证日志是否包含以下段落:
PrepareForBuild:
Creating directory “obj\Debug\”.
…
RestorePackages:
“C:\a\src\src.nuget\nuget.exe” install “C:\a\src\src\xxxx.Entities\packages.config”
-source -RequireConsent -o “C:\a\src\src\packages”
…
Successfully installed “EntityFramework 6.3.1”.
ResolveAssemblyReferences:
Primary reference “EntityFramework”.
请记住,当您浏览日志文件时,搜索部分字符串,因为目录,版本,软件包的名称等可能略有不同.如果找不到,那么很有可能在构建服务器上不恢复软件包.本地编译证明环境之间存在差异,很可能文件packages.config不可用.这是一个棘手的错误,因为失败的日志不会告诉你它丢失了.事实上,我的日志中根本没有提到它.
>首先,我创建了一个全新的项目Auto并将其签入.构建成功.
>然后,我添加了Entity Framework,并且构建失败并发出与您相同的警告.
>最后,我检查了packages.config文件.构建成功了.
出现此问题是因为初始签入选择了许多要忽略的文件.主要是bin,obj等,还有packages.config.它需要被特别选择为不被忽略.如果有人检查了所有文件(在我的视图中不是很明智),他也会获得所需的文件,因此看起来好像他们做得对.请注意,您应该首先将文件添加到版本控制.这样,它就会在每次更改时签入.否则,如果您在本地添加新包或更新现有包,问题将重新出现.
如果您收到警告但已恢复软件包(日志中列出了这些行),请尝试在本地更新软件包或重新安装它.最后,您可以通过运行Update-Package -Reinstall从程序包管理器控制台刷新安装.
>旧版软件包管理器here的类似问题.
>对需要签入的文件的建议不正确(自VS 2015起)here.
>文件布局的过时描述(对于VS 2013及更早版本有效)here.
>有关如何构建NuGet文件结构的更多信息here.
>关于这个问题非常好的博客(奇怪的是它在Google中没有出现在顶部)here.