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

时间:2017-03-12 13:00:59

标签: msbuild asp.net-core mono .net-core travis-ci

我有.NET Core projects我正在尝试使用最新的Mono和.NET Core 1.0.1工具(基于MSBuild的csproj工具)在Mac和Linux上使用Travis CI构建。他们定位netstandard1.6.1net45net461。我从Travis CI得到的错误是:

  

/usr/share/dotnet/sdk/1.0.1/Microsoft.Common.CurrentVersion.targets(1111,5):   错误MSB3644:框架的引用程序集   未找到“.NETFramework,Version = v4.5”。要解决此问题,请安装   此框架版本的SDK或Targeting Pack或重新定位您的   应用程序到您拥有SDK的框架版本   或安装了Targeting Pack。请注意,程序集将被解析   来自全球大会缓存(GAC)并将用于代替   参考组件。因此您的装配可能不正确   针对您想要的框架。

Mono不支持基于VS 2017 MSBuild的csproj项目吗?如何构建我的项目?

4 个答案:

答案 0 :(得分:6)

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

  • 使用this issue中所述的FrameworkPathOverride环境变量指向它们。

  • 将Travis构建限制为仅针对.NET Core构建。根据我的经验,这简单得多。

这是Noda Time .travis.yml文件,当我可以迁移时,我将用于Noda Time - 这是初步的,至少可以说,但它确实构建了......

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恢复”:(
  • dist: xenial没有运行时,我感到很惊讶,但事实并非如此。 (它声称环境不支持.NET Core。)我猜这会改变。
  • 我们正在使用NUnit,目前在新SDK中测试的唯一方法是使用NUnitLite,因此dotnet run运行测试
  • 我有点惊讶我不能只指定dotnet run目录名称(根据dotnet restoredotnet build)但似乎是事物的方式。我会找一个bug报告......

在任何一种情况下,我都建议使用基于Windows的CI构建来检查所有内容是否在Windows上构建和运行(理想情况下测试您支持的每个框架)。

答案 1 :(得分:1)

截至昨天(5月5日),@ dasMulli指出Mono发布了与.NET Core兼容的Mono 5.0 Beta 2(5.0.0.94)!这是his post on dotnet/sdk#335。这是指向最新beta release

的链接

我的.travis.yml文件如下:

state = tf.zeros([20, lstm_cell.state_size[0]*2)

答案 2 :(得分:1)

Mono DOES支持构建VS2017 .Net Framework项目,因为它现在使用msbuild。

要使其在Travis CI上运行有点棘手,但这应该可以解决问题:

┌───────┬─────────────┐
│ seq0  │   result    │
├───────┼─────────────┤
│ 01-04 │ 01-xx-xx-04 │
│ 02    │ xx-02-xx-xx │
│ 02-03 │ xx-02-03-xx │
│ 02-04 │ xx-02-xx-04 │
└───────┴─────────────┘

基本上,您需要手动手动安装dotnet-sdk及其所有依赖项。

然后只需调用msbuild:

  - 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

答案 3 :(得分:0)

.NET Framework Targeting Pack 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 
      Condition="'$(OS)' != 'Windows_NT'" 
      Include="Microsoft.NETFramework.ReferenceAssemblies" 
      PrivateAssets="All" 
      Version="1.0.0-preview.2" />
  </ItemGroup>

</Project>

更多信息可以在Microsoft/dotnet GitHub页面上找到。在撰写本文时,它处于预览状态,但我发现它确实有效。我发现的唯一问题是xUnit项目中的dotnet test无法正常工作,根据xUnit作者,这不是受支持的方案。