我已经接管了一个包含多个c#项目的web解决方案的维护工作。在编译时,一个项目按照预期在其输出目录bin文件夹下创建了Roslyn bin文件夹,而另一个项目则在C:\ bin \roslyn下创建了Roslyn bin文件夹。我已经搜索了项目文件,寻找任何关于为什么会发生这种情况的线索,但找不到任何关于它的引用。在构建日志中,它显示当在其输出目录下创建Roslyn文件夹的项目时,使用绝对目标路径(C:\project output dir \bin\Roslyn )复制文件,而在C:\bin\Roslyn下创建该文件夹的项目中,文件被列为仅复制到\bin\Roslyn。如果项目设置指向输出目录(设置了$(OutputDir))。如果有任何建议,我们将非常感谢。
发布于 2019-04-09 23:17:37
感谢您的指点,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)" />
发布于 2019-04-08 02:50:39
我知道3种调查MSBuild问题的方法:
总的来说,我发现二进制日志(Binlog)最有用。通过传递-bl创建一个文件,然后在MSBuild Structured Log Viewer中打开生成的文件。它显示了与构建日志非常相似的数据,但有一个很好的搜索,并在树视图中显示发生了什么,这对理解有很大帮助。
对于这个特定的问题,我认为对您最有用的可能是通过运行msbuild -pp或dotnet msbuild -pp输出预处理文件。这基本上是查找所有MSBuild Import语句,并将它们替换为导入文件的实际内容。我相信MSBuild总是自上而下地进行评估。因此,如果定义了property1,然后使用它来评估property2,那么稍后property1会发生变化,property2的值将保留评估时的值。请记住,目标的执行会导致对目标进行评估,因此,只要先运行较低的下一级目标,或者再下一级定义的属性或项是全局的(而不是在目标中),它就可以使用文件下一层定义的属性。
最后,如果所有其他方法都失败了,您可以尝试将日志输出设置为最高详细级别的诊断。请注意,msbuild -v:d是详细的详细信息,您需要msbuild -v:diag来设置诊断详细信息。我不确定这是否真的输出了比binlog中的内容更多的东西,但我认为可能有一两次我感到绝望,而diag输出有所帮助(但我不记得在那些情况下我是否使用了binlog )。无论如何,如果上面的其他两种方法都不起作用,那么值得一试。
https://stackoverflow.com/questions/55556635
复制相似问题