【问题标题】:Building VS 2017 MSBuild csproj Projects with Mono on Linux在 Linux 上使用 Mono 构建 VS 2017 MSBuild csproj 项目
【发布时间】:2017-08-02 12:43:10
【问题描述】:

我有.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 的框架版本 或已安装目标包。请注意,程序集将被解析 来自全局程序集缓存 (GAC) 并将用于代替 参考程序集。因此您的组装可能不正确 针对您想要的框架。

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

【问题讨论】:

  • 如果您以 .NET Framework 配置文件为目标,您应该使用 Windows (AppVeyor)。 Linux 上的 .NET Core 工具应该能够针对 .NET Core 配置文件进行编译。不需要 Mono,它不是 .NET Framework(提醒)。
  • @LexLi:当您想测试项目的 .NET Core 构建(至少)是否可以在 Linux 上运行时,这是一个非常糟糕的解决方案。我现在正面临这个问题......我希望我能够添加一个答案。
  • @JonSkeet 绝对是限制测试用例仅在 Windows 和 .NET Framework 上运行的糟糕解决方案。但是在这种情况下,Mono 没有资格替换 .NET Framework(因为它会给您的测试用例增加额外的怪异,我在开源项目中经常遇到这种情况)。
  • @LexLi:我不是建议使用 Mono。我建议想办法在 Linux 上构建/测试 .NET Core 部分。
  • @JonSkeet 这很公平。但我想知道微软如何为 Linux 提供必要的部分(Linux 上 .NET Framework 的引用程序集?),因为这不是一个小负担。

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


【解决方案1】:

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

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

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

这是我可以迁移时用于Noda Time 的 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 恢复”:(
  • 我很惊讶它没有在dist: xenial 上运行,但它没有。 (它声称环境不支持 .NET Core。)我猜这会改变。
  • 我们正在使用 NUnit,目前在新 SDK 中进行测试的唯一方法是使用 NUnitLite,因此 dotnet run 运行测试
  • 我有点惊讶我不能只为dotnet run 指定目录 名称(根据dotnet restoredotnet build),但这似乎是事情的方式。我会寻找错误报告...

无论哪种情况,我都建议使用基于 Windows 的 CI 构建,以检查所有内容是否在 Windows 上构建和运行(最好测试您支持的每个框架)。

【讨论】:

  • 我正在使用 Cake(我也推荐给 Nodatime)并选择了第二个选项,直到 Microsoft 重新获得对 Mono 的支持(关于它的 GitHub 问题)。
  • @MuhammadRehanSaeed:我一直想研究 Cake,但现在我只想解决所有问题,而不需要进行任何超出我真正需要的更改。我的最后一个拦截器是docfx :(
  • 此答案现在可能已过时,请参阅其他答案。也就是说,我还不能让它工作。
  • @Muhammad:有机会我会试一试,但暂时不会。
【解决方案2】:

截至昨天(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 文件如下所示:

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

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    .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 页面上找到。在撰写本文时,它处于预览状态,但我发现它确实有效。我发现的唯一问题是 xUnit 项目的 dotnet test 不起作用,并且根据 xUnit 作者的说法,它不是受支持的方案。

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 2018-10-12
      • 2014-06-21
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多