dotnet发布使用.NET Core 1.1和新的VS 2017项目格式失败

时间:2017-05-26 07:03:59

标签: asp.net-core msbuild .net-core visual-studio-2017

我们最近迁移到Visual Studio 2017 Update 2.我们有一个.NET Core 1.1应用程序,仅针对.NET Framework 4.6.1,并且在同一解决方案中具有对.NET Framework类库的项目引用。我们使用的是dotnet的1.0.4 SDK版本。

其中一个项目引用包含T4模板,这些模板配置为在构建时运行。这需要导入Microsoft.TextTemplating.targets和相关程序集,以便MSBuild可以转换T4模板。这些程序集又需要.NET Framework 4.6程序集(System,System.Data,System.Xml等)。

Visual Studio 2017在构建代码时没有问题,但是当我们尝试在TeamCity版本中使用dotnet builddotnet publish时,命令会失败并显示以下输出:

c:\xxx\Microsoft.TextTemplating.targets(340,5): error MSB4018: The "TransformTemplates" task failed unexpectedly. c:\xxx\Microsoft.TextTemplating.targets(340,5): error MSB4018: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified. c:\xxx\Microsoft.TextTemplating.targets(340,5): error MSB4018: File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

根据我迄今为止所做的研究,运行T4转换任务所需的.NET Framework引用并未由dotnet CLI加载,但由于完全独立的MSBuild工具链,它们由Visual Studio加载。 / p>

有没有办法让dotnet publish以与Visual Studio相同的方式工作?这个问题彻底打破了我们的CI / CD列车。

注意:我尝试将.NET Standard作为目标框架,看看是否可行,但我们使用了几个不兼容的软件包,因此不是一个选项(Entity Framework 6.1,例如)。

1 个答案:

答案 0 :(得分:3)

基于dotnet的命令在MSBuild的.NET Core版本上运行,因此无法加载完整的框架程序集。如果这些程序集没有.NET Core或.NET Standard版本,那么在.NET Core版本的MSBuild构建期间加载它们是不可能的(这可能会转移到.NET Core 2.0)。

为了使CI / CD正常工作,您需要使用VS版本的MSBuild。 dotnet publish仅转发到msbuild,因此您可以获得将参数传递给msbuild的相同行为。例如:

dotnet publish -c Release

变为

msbuild /m /t:Publish /p:Configuration=Release