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

问题描述 投票:1回答:2

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

c# nuget roslyn
2个回答
0
投票

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

通常,我发现二进制日志(binlogs)最有用。通过传递-bl创建一个,然后在MSBuild Structured Log Viewer中打开生成的文件。它显示与构建日志非常相似的数据,但具有良好的搜索功能,并显示树视图中发生的事情,这有助于理解。

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

最后,如果所有其他方法都失败了,您可以尝试将日志输出设置为最高详细程度,诊断。请注意,msbuild -v:d详细详细,您需要msbuild -v:diag来设置诊断详细程度。我不确定这实际上输出的内容是否比binlog中的更多,但我认为可能有一两次我绝望并且diag输出有帮助(但是我不记得我是否在那些中使用了binlog场合)。无论如何,如果上面的其他两种方法没有帮助,值得一试。


0
投票

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

<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)" />

© www.soinside.com 2019 - 2024. All rights reserved.