这种bug, 表现为你的solution有时能编译成功, 有时却失败. 我碰到的实际情况是, 在自己的开发机上总是成功, 而在build server上有时失败.
原因是, solution中各个项目的build order没有保证, 而实际上这些项目之间却有必要的build order. 比如项目A, 引用了项目B生成的DLL, 但不是以project reference方式引用, 而是以file-based方式引用项目B生成的DLL. 这种情况下项目A潜在地需要项目B先生编译成功.
典型的情况是在一个solution中包含了单元测试的项目, 而单元测试项目包含在该solution中只是为了方便修改代码后立即运行测试代码, 另有一个单独的单元测试的solution文件, 包含着所有的单元测试项目, 此时单元测试项目出现在两个solution中, 它必需以file-based方式引用那些它要测试的项目. 一个项目对其它组件的引用关系是维护在项目文件中, 但项目之间的build order却维护在solution文件中.
没有正确指定build order的solution, 有时能成功, 有时却失败, 原因在于msbuild会在遵循solution文件中指定的依赖关系前提下, 并行编译各个项目, 既然是并行编译, 整个项目的实际build order就是动态的. 所以当一个项目实际需要引用的另一项目尚未在另一个并行编译任务中完成时, 该项目就会失败.
阅读(941) | 评论(0) | 转发(0) |