在 c:\bin\roslyn 生成的 Roslyn bin 文件夹

Roslyn bin folder generated at c:\bin\roslyn

我已经接管了包含多个 c# 项目的 Web 解决方案的维护工作。在编译时,一个项目按预期在其输出目录 bin 文件夹下创建 Roslyn bin 文件夹,但另一个项目在 C:\bin\roslyn 中创建 Roslyn bin 文件夹。我已经在项目文件中搜索了关于为什么会发生这种情况的任何线索,但找不到任何参考资料。在构建日志中,它显示当在其输出目录下创建 Roslyn 文件夹的项目时,将使用绝对目标路径(C:\project output dir\bin\Roslyn)复制文件,而在创建它的项目中C:\bin\Roslyn,文件列为刚刚复制到\bin\Roslyn。项目设置是否应指向输出目录(已设置 $(OutputDir))。任何指针将不胜感激。

我知道 3 种调查 MSBuild 问题的方法:

总的来说,我发现二进制日志 (binlogs) 最有用。通过 -bl 创建一个,然后在 MSBuild Structured Log Viewer 中打开生成的文件。它显示了与构建日志非常相似的数据,但搜索效果很好,并以树视图显示了发生的事情,这极大地帮助了理解。

对于这个特定问题,我认为可能对您最有用的是通过 运行ning msbuild -ppdotnet msbuild -pp 输出预处理文件。这基本上找到了所有 MSBuild Import 语句,并将它们替换为导入文件的实际内容。我相信 MSBuild 总是自上而下地评估。因此,如果 属性1 被定义,然后用于评估 属性2,然后 属性1 发生变化,属性2 的值将保留它原来的值评估。请记住,目标的执行会导致对目标进行评估,因此它可以使用在文件下方定义的 属性,只要较低的目标首先是 运行,或者属性或进一步向下定义的项目是全局的(不在目标中)。

最后,如果一切都失败了,您可以尝试将日志输出设置为最高详细程度,即诊断。请注意,msbuild -v:d 是详细详细信息,您需要 msbuild -v:diag 来设置诊断详细信息。我不确定这是否真的输出了比二进制日志更多的东西,但我想可能有一两次我很绝望,诊断输出有帮助(但我不记得我是否在那些中使用了二进制日志场合)。无论如何,如果以上其他两种方法都不起作用,值得一试。

感谢您的指点,Icepickle 的问题是正确的,解决方案有效,但只是在根驱动器之外放置了一个冗余文件夹,因此并不理想。我已经通过解决方案构建(在诊断详细信息中)对问题进行了排序,并且在所有将文件复制到根文件夹的项目中,我在他们的项目文件中添加了以下内容。这指向正确的路径,并且只有在文件不存在时才会复制。

<Target Name="CopyRoslynCompilerFilesToOutputDirectory" AfterTargets="AfterBuild">
<ItemGroup>
  <RoslynFiles Include="$(CscToolPath)\*" />
</ItemGroup>
<MakeDir Directories="$(SolutionDir)$(SolutionName)\bin\roslyn" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(SolutionDir)$(SolutionName)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />