在Linux上使用Mono构建VS 2017 MSBuild csproj项目

9

我有.NET Core项目,我试图在Mac和Linux上使用最新的Mono和.NET Core 1.0.1工具(基于MSBuild的csproj工具)构建它们。它们的目标是netstandard1.6.1net45net461。我从Travis CI得到的错误是:

/usr/share/dotnet/sdk/1.0.1/Microsoft.Common.CurrentVersion.targets(1111,5): 错误 MSB3644: 未找到框架“.NETFramework,Version=v4.5”的参考程序集。要解决此问题,请安装此框架版本的SDK或定位包,或将应用程序重新定位到您已安装SDK或定位包的框架版本。请注意,程序集将从全局程序集缓存(GAC)中解析,并将用于替代参考程序集。因此,您的程序集可能无法正确地针对您打算使用的框架进行定位。

Mono是否不支持基于VS 2017 MSBuild的csproj项目?我该如何使我的项目能够构建?


如果你的目标是.NET Framework配置文件,你应该使用Windows(AppVeyor)。在Linux上,.NET Core工具应该能够编译针对.NET Core配置文件。不需要使用Mono,因为它不是.NET Framework(请注意)。 - Lex Li
@LexLi:当你想测试一个项目的.NET Core在Linux上是否能够构建时,这是一个非常糟糕的解决方案。我现在正面临着这个问题...希望我能够添加一个答案。 - Jon Skeet
@JonSkeet 当然,将测试用例限制在仅在Windows和.NET Framework上运行是一个不好的解决方案。但在这种情况下,Mono并不能取代.NET Framework(因为它可能会在您的测试用例中添加额外的奇怪问题,并且我在我的开源项目中经常遇到这种情况)。 - Lex Li
@LexLi:我并不是建议使用Mono。我是建议想办法在Linux上构建/测试只有.NET Core部分的内容。 - Jon Skeet
@JonSkeet 这很公平。但我想知道微软如何为Linux提供必要的组件(例如.NET Framework在Linux上的引用程序集?),因为这不是一个小负担。 - Lex Li
4个回答

6

据我所知,这里有两个选项:

  • 使用FrameworkPathOverride环境变量来指向它们,具体描述请参见此问题.

  • 限制您的Travis构建仅针对.NET Core构建。在我的经验中,这显着更简单。

这是我将在Noda Time上使用的.travis.yml文件 - 它还很初步,但确实会构建...

language: csharp
mono: none
dotnet: 1.0.1
dist: trusty

script:
  - dotnet restore src/NodaTime
  - dotnet restore src/NodaTime.Test
  - dotnet restore src/NodaTime.Serialization.Test
  - dotnet build src/NodaTime -f netstandard1.3
  - dotnet build src/NodaTime.Test -f netcoreapp1.0
  - dotnet build src/NodaTime.Serialization.Test -f netcoreapp1.0
  - dotnet run -p src/NodaTime.Test/*.csproj -f netcoreapp1.0 -- --where=cat!=Slow
  - dotnet run -p src/NodaTime.Serialization.Test/*.csproj -f netcoreapp1.0

以下是一些注释:

  • 与早期的SDK不同,现在我们需要单独还原每个项目 - 没有大型的“dotnet restore at the top level”:(
  • 当这个程序没有在dist: xenial上运行时,我感到很惊讶,但它确实没有。 (它声称环境不支持.NET Core。)我猜这将会改变。
  • 我们正在使用NUnit,在新SDK中测试的唯一方法是使用NUnitLite,因此使用dotnet run来运行测试
  • 我稍微惊讶于不能仅指定目录名称以运行dotnet run(如dotnet restoredotnet build),但似乎事情就是这样。 我将寻找一个错误报告...

无论哪种情况,我建议您还要进行基于Windows的CI构建,以检查所有内容是否在Windows上构建和工作,并最好测试您支持的每个框架。


我正在使用Cake(我也建议Nodatime使用它),并在微软重新添加对Mono的支持之前选择了第二个选项(有一个GitHub问题与此相关)。 - Muhammad Rehan Saeed
1
@MuhammadRehanSaeed:我一直想研究一下Cake,但现在我只想尽可能减少不必要的更改,让一切都稳定下来。 我最后的障碍是docfx :( - Jon Skeet
这个答案可能已经过时了,请查看其他答案。话虽如此,我还不能让它工作。 - Muhammad Rehan Saeed
@Muhammad:我会在有机会的时候尝试一下,但可能要等一段时间。 - Jon Skeet

1
Mono可以支持构建VS2017 .Net Framework项目,因为它现在使用msbuild。
要在Travis CI上使其正常工作有点棘手,但是以下步骤应该能解决问题:
  - wget -q https://packages.microsoft.com/config/ubuntu/14.04/packages-microsoft-prod.deb
  - sudo dpkg -i packages-microsoft-prod.deb
  - wget -q http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/gcc-5-base_5.4.0-6ubuntu1~16.04.9_amd64.deb
  - sudo dpkg -i gcc-5-base_5.4.0-6ubuntu1~16.04.9_amd64.deb
  - wget -q http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.9_amd64.deb
  - sudo dpkg -i libstdc++6_5.4.0-6ubuntu1~16.04.9_amd64.deb
  - wget -q http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu55_55.1-7ubuntu0.4_amd64.deb
  - sudo dpkg -i libicu55_55.1-7ubuntu0.4_amd64.deb
  - sudo apt-get install apt-transport-https
  - sudo apt-get install -y libicu55
  - sudo apt-get install dotnet-runtime-deps-2.1
  - sudo apt-get install dotnet-runtime-2.1
  - sudo apt-get install aspnetcore-runtime-2.1
  - sudo apt-get install dotnet-sdk-2.1

基本上,您需要手动安装dotnet-sdk及其所有依赖项。
然后只需调用msbuild:
  - msbuild /p:Configuration=Release Solution.sln

1
截至昨天(5月5日),@dasMulli指出Mono发布了Mono 5.0 Beta 2(5.0.0.94),可与.NET Core一起使用!这是他在dotnet/sdk#335上发布的帖子。这是最新beta版本的链接。
我的.travis.yml文件如下:
sudo: required
dist: trusty
language: csharp
solution: MySolution.sln
mono:
  - beta
dotnet: 1.0.3

install:
  - nuget restore MySolution.sln
  - dotnet restore MySolution.sln

script:
  - msbuild /t:Rebuild MySolution.sln

我的travis.yml正在安装mono latest,这是目前的版本5.2.0。我的构建仍然无法构建针对netstandard和net45的.NET Core项目 https://travis-ci.org/RehanSaeed/Serilog.Exceptions/jobs/266445606 - Muhammad Rehan Saeed

0

.NET Framework 目标包 Nuget 包

现在,您可以通过添加 NuGet 包,在 Linux 上使用 Mono 构建新样式的 csproj 项目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup Label="Build">
    <OutputType>Exe</OutputType>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>

  <ItemGroup Label="Package References">
    <PackageReference 
      Include="Microsoft.NETFramework.ReferenceAssemblies" 
      PrivateAssets="All" 
      Version="1.0.0-preview.2" />
  </ItemGroup>

</Project>

更多信息可以在Microsoft/dotnet的GitHub页面上找到。在撰写本文时,它处于预览阶段,但我发现它确实可以工作。我发现唯一的问题是dotnet test与xUnit项目不兼容,并且根据xUnit作者的说法,这不是一个支持的场景。


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