我正在一个不常见的堆栈中做一些实验。我有一个.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
,但从那以后,我一直得到
所有xproj的错误都是无法导入“$(VSToolsPath)\ DotNet \ Microsoft.DotNet.Props”
。虽然我能够使用dotnet restore
和dotnet 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项目需要分开。
答案 0 :(得分:1)
您的情况是已知问题和.NET和.NET Core工具正在进行中的混合。 xproj
是基于project.json
的项目的msbuild包装器,使其可以与Visual Studio和其他项目类型一起使用。目标安装在全局MSBuild位置,仅包含在Visual Studio的.NET Core Tooling安装程序中。
您的选择是:
dotnet cli的preview2
/ preview2.1
版本知道如何为.NET“完整”框架构建库和控制台应用程序。它还知道linux和unix上的mono,还有一个环境变量(DOTNET_REFERENCE_ASSEMBLIES_PATH
),它允许你告诉它xbuild的引用程序集在哪里找不到它。
这意味着您可以制作所有项目project.json
- 甚至是仅针对完整框架的项目。 dependencies
中project.json
部分的解析将在project.json
的同一文件夹或指定项目位置中找到其他基于global.json
的项目。
只要你的所有项目都只是库和控制台应用程序,这就允许你在linux和mac上构建所有东西。但是,您需要多次dotnet build
次调用,每个项目一次,因为dotnet
工具不了解解决方案文件。在对比中,dotnet restore
会找到文件夹中的所有项目(或解释global.json > projects
afaik)并将其全部恢复。
最新发布的msbuild版本了解.NET Core,可以构建一个面向.NET Core的csproj
。但它是csproj
和project.json
的混合物,鲜为人知/使用,可能很快会以其当前的形式消失。只有一个短guide on how to make it work with visual studio。您可以尝试使用该目标进行franken-build,但可能效果不佳。
无论如何,.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更改。
两步构建:
使用project.json
构建所有库和.NET核心应用程序。然后使用dotnet pack
将所有库作为NuGet包打包到临时位置。 “经典”.NET项目可以通过NuGet引用这些包,并使用临时路径作为附加源进行恢复 - 通过NuGet.Config
文件或-s ../tmp-packages
的{{1}}参数。
这消除了在VS中的两个项目上编码的可能性,并且可以直接使用新添加的方法,但是您可以构建nuget
支持的所有类型的项目(xamarin,web apps,...)。 / p>