我们最近迁移到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 build
或dotnet 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,例如)。
答案 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