在VSTS Build上,单元测试在roslyn二进制文件中的位置不正确

时间:2018-09-06 13:58:06

标签: c# unit-testing azure-devops roslyn azure-pipelines

我们有一个Web应用程序,该应用程序大量使用动态代码编译。 我的任务是添加C#6功能并利用roslyn编译器。

这样做非常简单。只需添加nuget包

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform:2.0.0

所有使用动态代码编译并更改一行代码的项目

private static System.CodeDom.Compiler.CodeDomProvider Compiler => compiler 
?? (compiler =                                                                             
new 
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider());

到目前为止一切正常。将nuget包添加到使用动态代码编译的单元测试中之后,它们也可以工作(本地化)。

但是当我查询VSTS / TFS服务器上的新版本时,某些单元测试失败。经过一番研究,我发现了问题所在:

  

System.IO.DirectoryNotFoundException:找不到路径“ D:\ Agents \ agent_work \ 1 \ a \ roslyn \ csc.exe”的一部分。       在System.IO .__ Error.WinIOError(Int32 errorCode,可能是StringFullPath)       在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess访问,Int32权限,布尔useRights,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,字符串msgPath,布尔bFromProxy,布尔useLongPath,布尔checkHost)       在System.IO.FileStream..ctor处(字符串路径,FileMode模式,FileAccess访问,FileShare共享)       在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.get_CompilerName()       在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch(CompilerParameters选项,String []文件名)       在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromSourceBatch(CompilerParameters选项,String []源)       在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromSourceBatch(CompilerParameters选项,String []源)       在System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters选项,String []源)处       在[...]

好吧,项目根目录是查找roslyn二进制文件的错误位置。

在相关单元测试的app.config中:

<appSettings>
    <add key="aspnet:RoslynCompilerLocation" value="roslyn" />
  </appSettings>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>

我也尝试过nuget包Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix

没有成功。我发现了很多信息,如何解决/ bin / roslyn错误,但是对于构建服务器,单元测试和roslyn的特殊组合一无所知。有人有更多信息吗?

编辑:

我尝试了Jayendran的建议解决方案。我发现变量$(CscToolPath)和$(WebProjectOutputDir)像这样是空的:

<Target Name="CheckVariables" AfterTargets="AfterBuild" Condition="'$(OutDir)' != '$(OutputPath)'">
    <Message Text="$(OutDir)" Importance="high"/>
    <Message Text="$(OutputPath)" Importance="high"/>
    <Message Text="$(CscToolPath)" Importance="high"/>
    <Message Text="$(WebProjectOutputDir)" Importance="high"/>
  </Target>

$(CscToolPath)和$(WebProjectOutputDir)没有输出。

EDIT2: 解决方法是,编辑单元测试的app.configs如下:

<appSettings>
    <add key="aspnet:RoslynCompilerLocation" value="_PublishedWebsites\*OneOfTheWebApps*\bin\roslyn" />
  </appSettings>

单元测试现在可以找到二进制文件,而且似乎此更改对我的本地计算机没有影响。单元测试现在在本地和构建服务器上通过。但是,这不能解决这个问题。

0 个答案:

没有答案