今天一个待上线服务测试完毕,需要构建CI,按照模板配置好包还原,xbuild编译,报错,错误信息如下:
EtcdRegister.cs(8,15): error CS0234: The type or namespace name `LawDissector' does not exist in the namespace `Gridsum'. Are you missing an assembly reference? EtcdRegister.cs(14,20): error CS0246: The type or namespace name `IEtcdClient' could not be found. Are you missing an assembly reference? 3 Warning(s) 2 Error(s) Time Elapsed 00:00:03.7878830 Build step 'Execute shell' marked build as failure Finished: FAILURE
缺少一个包引用,但是如果用MSBUILD则没有问题。
首先分析这个缺少的包,推送至公司nuget源的组件,在jenkins服务器上该项目的路径下查看该包的还原packages文件夹,这个组件已经被正确还原了;
按道理说所有依赖组件都已经被正确还原,那么不会出现编译缺组件的问题,而且版本信息也无误。
分析解决方案的组织结构,其引用了两个外部工程(csproj),初步定为问题可能与此相关,缺少的组件也是在引用的外部工程所依赖的,因此猜测问题是不是因为所引用的外部工程在还原过程中并未还原这个组件导致,在jenkins服务器上查看着两个外部工程所属的真实解决方案的packages,确实少了这个组件的还原包。
解决方法:
1:在引用的外部工程所属的解决方案packages.config中添加缺少的依赖组件的nuget信息;
2:在jenkins集成中,对引用的外部工程所属的nuget进行一次还原;
3:再对本项目进行编译,问题解决。
这个问题在跨项目工程引用的情境下应该都会出现,xbuild的编译依赖于nuget包在各个依赖项的原始路径下的还原信息,以此作为排查依据即可。