Linux上的.NET标准版

时间:2016-10-25 20:54:14

标签: msbuild mono .net-core

我正在一个不常见的堆栈中做一些实验。我有一个.NET解决方案,它是 .NET Standard Core 和常规.NET Framework项目的混合体。 VS,框架和工具都更新为最新版本。

我想将 gitlab CI docker runner一起用于ubuntu

在我介绍Core / Net标准库(xprojs)之前,我能够通过执行

来构建我的解决方案
MONO_IOMAP=case xbuild /t:Build /p:Configuration="Release" /p:Platform="Any CPU" ./src/CoreLibrary/CoreLibrary.sln

,但从那以后,我一直得到

  

无法导入“$(VSToolsPath)\ DotNet \ Microsoft.DotNet.Props”

所有xproj的错误都是

。虽然我能够使用dotnet restoredotnet build构建xprojs,但其余的只能使用xbuild构建。现在我有两个解决方案,可以分别在linux上构建非xbuild,以避免错误。这是我能做的最好的吗?有人可以给我一个如何正确做到这一点的提示吗?

更新

为简化起见,假设我在解决方案中有两个项目: .NET Core Library 项目,目标是 netstandard1.4 (xproj)和相同的旧 .NET控制台应用程序,目标是 .NET Framework 4.6.1 (csproj)。控制台应用程序依赖于netstandard库。

从Visual Studio,我可以毫无问题地构建解决方案,两个项目都可以正确构建。从我的Windows机器,我也可以使用dotnet utility tool来构建/运行xprojs。一切正常。

在我的基于ubuntu的容器中,mono无法构建解决方案,它显示上面的错误(听起来合理,没有安装VS)。我只能通过使用正常工作的dotnet utility tool来构建xproj,并且有一个单独的解决方案文件,它不包含xprojs,只包含控制台应用程序并使用xbuild构建它。

我主要担心(事实上这不是一个方便的解决方案)是如果VS中的错误得到修复,这使得目前无法从csprojs添加对xprojs的引用作为项目引用,我将无法使用它,因为我的csproj项目需要分开。

1 个答案:

答案 0 :(得分:1)

您的情况是已知问题和.NET和.NET Core工具正在进行中的混合。 xproj是基于project.json的项目的msbuild包装器,使其可以与Visual Studio和其他项目类型一起使用。目标安装在全局MSBuild位置,仅包含在Visual Studio的.NET Core Tooling安装程序中。

您的选择是:

  1. dotnet cli的preview2 / preview2.1版本知道如何为.NET“完整”框架构建库和控制台应用程序。它还知道linux和unix上的mono,还有一个环境变量(DOTNET_REFERENCE_ASSEMBLIES_PATH),它允许你告诉它xbuild的引用程序集在哪里找不到它。

    这意味着您可以制作所有项目project.json - 甚至是仅针对完整框架的项目。 dependenciesproject.json部分的解析将在project.json的同一文件夹或指定项目位置中找到其他基于global.json的项目。

    只要你的所有项目都只是库和控制台应用程序,这就允许你在linux和mac上构建所有东西。但是,您需要多次dotnet build次调用,每个项目一次,因为dotnet工具不了解解决方案文件。在对比中,dotnet restore会找到文件夹中的所有项目(或解释global.json > projects afaik)并将其全部恢复。

  2. 最新发布的msbuild版本了解.NET Core,可以构建一个面向.NET Core的csproj。但它是csprojproject.json的混合物,鲜为人知/使用,可能很快会以其当前的形式消失。只有一个短guide on how to make it work with visual studio。您可以尝试使用该目标进行franken-build,但可能效果不佳。

  3. 无论如何,.NET Core工具正在转向msbuild。这意味着只要拥有所有目标/属性文件,就可以完全支持.sln.csproj甚至自定义msbuild项目。 MSBuild目标通过NuGet包(Microsoft.NET.Sdk)分发,该包将替换所有c#项目类型的全局安装的msbuild目标。 dotnet sdk附带了一个自包含的msbuild xplat版本,该项目通过NuGet实现其目标定义。截至目前,这些目标并不真正适用于单声道,但它们want to make it work with mono或者至少构建了Linux上的完整框架。

    因此,如果您等待.NET Core工具成熟,您可能会dotnet build your.sln。也许mono的xbuild会接受新的msbuild更改。

  4. 两步构建:

    使用project.json构建所有库和.NET核心应用程序。然后使用dotnet pack将所有库作为NuGet包打包到临时位置。 “经典”.NET项目可以通过NuGet引用这些包,并使用临时路径作为附加源进行恢复 - 通过NuGet.Config文件或-s ../tmp-packages的{​​{1}}参数。

    这消除了在VS中的两个项目上编码的可能性,并且可以直接使用新添加的方法,但是您可以构建nuget支持的所有类型的项目(xamarin,web apps,...)。 / p>