在TFS中构建使用C#6的网站

4
我已经在我的Visual Studio 2015解决方案中使用Nuget添加了Microsoft.CodeDom.Providers.DotNetCompilerPlatform,以提供一些C#6的功能。本地运行和构建一切正常。
我将代码检入TFS并为其创建了构建任务。但是,当通过TFS构建它时,会出现以下错误:
ShowcasePortal\web.config(20,0): Error ASPCONFIG: The CodeDom provider type "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" could not be located.

执行以下代码行时:
Build:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /localhost_15584 -p ShowcasePortal\ -u -f PrecompiledWeb\localhost_15584\ 

这些都托管在Visual Studio Online上。

有没有办法获取此生成文件呢?

更新:

我注意到默认情况下Bin文件夹不会自动检入。其中包括Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll以及roslyn文件夹。 我已将其添加到源代码控制中(不确定是否需要添加Roslyn文件夹)。一旦添加,就可以正常工作了。

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.2" targetFramework="net461" />
  <package id="Microsoft.Net.Compilers" version="1.3.2" targetFramework="net461" developmentDependency="true" />
</packages>

构建定义

构建定义如下所示:

构建步骤

这只是一个普通的解决方案构建,我没有做任何特殊处理。

更新12月8日

我将bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll.refresh文件添加到版本控制中,并启动了一个构建,结果出现以下错误:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /localhost_15584 -p ShowcasePortal\ -u -f PrecompiledWeb\localhost_15584\ 
ASPNETCOMPILER(0,0): Error ASPRUNTIME: Could not find a part of the path 'C:\a\1\s\ShowcasePortal\bin\roslyn\csc.exe'.

现在,bin\Roslyn文件夹在我的本地机器上存在。这没有被检入。

还有一个名为Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix的nuget包。我安装了它并尝试了云构建。但是这并没有起作用——它出现了相同的错误(找不到csc)。

解决方案

当添加Microsoft.CodeDom.Providers.DotNetCompilerPlatform包时,它会带来依赖项Microsoft.Net.Compilers包。这将向网站Bin文件夹中添加Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll文件。还有一个未添加到解决方案中的Bin\Roslyn文件夹,其中包含各种编译器二进制文件。一旦Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll与所有Bin\Roslyn文件一起检入版本控制,云服务器构建就可以成功编译。


1
你应该将这些东西作为NuGet包添加,而不是直接检入源代码控制。 - MrHinsh - Martin Hinshelwood
在我的公司里,这种情况发生是因为那只是一个网站而不是一个Web应用程序,也就是说,解决方案之一是经过将网站转化为Web应用程序的过程。另外一个可能是微软忘记了检查。 - Yuval Perelman
我尝试按照一些在线指南将我们的单体网站转换为Web应用程序。但由于出现了太多错误,我放弃了! - Andez
1个回答

1

我使用Nuget添加了Microsoft.CodeDom.Providers.DotNetCompilerPlatform,但在服务器上构建失败。直到我从Bin文件夹中检查了DLL,它才开始工作。我已更新问题。 - Andez
如果您已在构建定义中添加了Nuget还原任务,但仍找不到相关的dll,则似乎NuGet未在构建时还原包。有很多可能性。同时还要双重检查packages.config文件。我想说,如果检查源代码控制中的bin文件夹可以解决问题,则NuGet包还原也会达到相同的效果。 - PatrickLu-MSFT
好奇的是,我在另一台电脑上找到了解决方案,但与生成服务器一样出现了相同的错误:找不到CodeDom提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,Microsoft.CodeDom.Providers.DotNetCompilerPlatform,Version=1.0.2.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”。这是在空Bin文件夹中。Nuget包还原似乎没有处理编译器。 - Andez
1
看起来你正在使用VSTS而不是TFS。否则,您可以直接将文件夹复制到构建服务器进行测试。无论如何,您提供的解决方案完美地解决了问题,已经足够了。感谢分享。 - PatrickLu-MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接