如何将 Travis-CI 与 C# 或 F# 一起使用

Posted

技术标签:

【中文标题】如何将 Travis-CI 与 C# 或 F# 一起使用【英文标题】:How do I use Travis-CI with C# or F# 【发布时间】:2013-05-21 01:07:25 【问题描述】:

Travis CI 持续集成服务官方支持很多languages,但不支持C#或F#。

我可以在我的 .net 项目中使用它吗?

【问题讨论】:

【参考方案1】:

请参阅danielnixon's answer 了解现在执行此操作的官方方法。

有可能。

1。您的项目需要在 Mono 上运行

在您自己的单声道机器上,使用终端 cd 进入您的解决方案目录并运行命令 xbuild。这可能会自动起作用,也可能不会,因为您在 Visual Studio 中使用的某些功能需要在单声道中进行一些调整。

注意事项:

缺少文件错误,检查以确保文件名的大小写与您的.csproj linux 有区分大小写的路径,而 windows 没有。 如果您的项目自动恢复,Nuget 要求您在运行 xbuild 之前先 export EnableNuGetPackageRestore=true。 您的 mono 实例可能没有根 SSL 证书,请使用 mozroots --import --sync 安装它们。 此外,如果您看到丢失的文件错误,您的 .csproj 中的 nuget.* 而不是 NuGet.* 引用已知存在于各种版本的 nuget 中。 2.5 nuget 的目标文件中存在一个基于 .target 文件中的空格的错误,解决方法here 要获得 FSharp 3.0 支持,您需要 mono 3.0.X 或更高版本(可能需要从源代码构建,但默认安装在 Mac OS X 上) 对于来自 VS2013 的 FSharp 项目,您可能需要编辑 .fsproj 以通过添加 '$(VisualStudioVersion)' == '11.0' Or $(OS) != 'Windows_NT' 来触发非 Windows 机器上的 VS2012 配置,请参阅 example。

单声道 3.1.12、3.2.4 及更高版本

Mono 3.1.2、3.2.4 及更高版本支持 pcl,但也可能缺少 PCL 错误。请注意以下 Mono 3.0.12 下列出的错误,因为它仅包含以下框架引用: v4.0、Profile136 .NET Framework 4、Silverlight 5、Windows Phone 8、Windows 应用商店应用程序 (Windows 8) v4.0,Profile14 .NET Framework 4,Silverlight 5 v4.0、Profile147 .NET Framework 4.0.3、Silverlight 5、Windows Phone 8、Windows 应用商店应用程序 (Windows 8) v4.0、Profile158 .NET Framework 4.5、Silverlight 5、Windows Phone 8、Windows 应用商店应用程序 (Windows 8) v4.0,Profile19 .NET Framework 4.0.3,Silverlight 5 v4.0,Profile24 .NET Framework 4.5,Silverlight 5 v4.0、Profile37 .NET Framework 4、Silverlight 5、Windows 应用商店应用程序 (Windows 8) v4.0、Profile42 .NET Framework 4.0.3、Silverlight 5、Windows 应用商店应用程序 (Windows 8) v4.0、Profile47 .NET Framework 4.5、Silverlight 5、Windows 应用商店应用程序 (Windows 8) v4.0,Profile5 .NET Framework 4,Windows 应用商店应用程序 (Windows 8) v4.0,Profile6 .NET Framework 4.0.3,Windows 应用商店应用程序 (Windows 8) v4.5,Profile49 .NET Framework 4.5,Windows Phone 8 v4.5,Profile7 .NET Framework 4.5,Windows 应用商店应用程序 (Windows 8) v4.5、Profile78 .NET Framework 4.5、Windows Phone 8、Windows 应用商店应用程序 (Windows 8)

单声道 3.0.12

Mono 3.0.12 具有可移植类库的目标,但没有参考程序集。查找Unable to find framework corresponding to the target framework moniker '.NETPortable,Version=v4.0,Profile=ProfileX'. Framework assembly references will be resolved from the GAC, which might not be the intended behavior. 使用平台条件(在Mono 3.0.11 或更早版本中提及)或升级到3.1.2。

Mono 3.0.11 或更早版本

Missing Target 错误,如果不是 nuget,可能是因为您使用的是 Portable 类库目标或其他不存在的目标。如果您的项目可以为 .net 4.0 编译,您可以修改您的 .csproj 或 .fsproj,以便在 .net 上构建可移植的,在 mono 上为 .net 4.0 构建。基本上通过将事物分成条件属性组<PropertyGroup Condition="$(OS) == 'Windows_NT'"> <TargetFrameworkProfile>Profile46</TargetFrameworkProfile> </PropertyGroup>Condition="$(OS) != 'Windows_NT' 用于单声道。你的旅费可能会改变。见工作example。

单声道 2.10.X

此外,Mono v2.10 缺少一些 Nuget 需要的 Microsoft.Build 类,您可以将非常小的 v3.0.X dll 复制到 .nuget 目录。 (我用过here)

2。能够从命令行运行单元测试。

.ci/nunit.sh 是我自己的用于 nunit 测试的 shell 脚本,已检查到 repo 的根目录中。所以我可以使用 nuget 安装我想要的 nunit-console 版本,并配置各种包含/排除类别。您的里程可能会有所不同,但这种技术应该适用于 xunit 等。或者使用 xbuild 或fake 做你自己的事情。

.ci/nunit.sh

#!/bin/sh -x

mono --runtime=v4.0 .nuget/NuGet.exe install NUnit.Runners -Version 2.6.1 -o packages

runTest()
    mono --runtime=v4.0 packages/NUnit.Runners.2.6.1/tools/nunit-console.exe -noxml -nodots -labels -stoponerror $@
   if [ $? -ne 0 ]
   then   
     exit 1
   fi


#This is the call that runs the tests and adds tweakable arguments.
#In this case I'm excluding tests I categorized for performance.
runTest $1 -exclude=Performance

exit $?

3。为单声道配置 Travis

单声道 v3.8.0

为了测试最新的单声道,最简单的方法是使用 Mac 主机(目标是使用 language:objective-c Mono v3.1.2,后来将 Mac 上的分发版从 DMG 更改为仅 PKG,因此安装非常简单。 此模板应支持可移植类库、.NET 4.5.1 和 FSharp 3.1。

language: objective-c

env:
 global:
  - EnableNuGetPackageRestore=true 
 matrix:
  - MONO_VERSION="3.8.0"

before_install:
 - wget "http://download.mono-project.com/archive/$MONO_VERSION/macos-10-x86/MonoFramework-MDK-$MONO_VERSION.macos10.xamarin.x86.pkg"
 - sudo installer -pkg "MonoFramework-MDK-$MONO_VERSION.macos10.xamarin.x86.pkg" -target /

script:
 - xbuild 
 - .ci/nunit.sh Tests/bin/Debug/Tests.dll

同时定位 Mono v2.10.X 和 v3.0.X

我很容易使用 Mac 主机为多个版本的 Mono 设置构建矩阵。请参阅下面的脚本

language: objective-c

env:
 global:
  - EnableNuGetPackageRestore=true 
 matrix:
  - MONO_VER="2.10.11"
  - MONO_VER="3.0.12"

before_install:
 - wget "http://download.mono-project.com/archive/$MONO_VER/macos-10-x86/MonoFramework-MDK-$MONO_VER.macos10.xamarin.x86.dmg"
 - hdid "MonoFramework-MDK-$MONO_VER.macos10.xamarin.x86.dmg"
 - sudo installer -pkg "/Volumes/Mono Framework MDK $MONO_VER/MonoFramework-MDK-$MONO_VER.macos10.xamarin.x86.pkg" -target /

script:
 - xbuild 
 - .ci/nunit.sh Tests/bin/Debug/Tests.dll

Linux 版

请参阅Answer below 了解新的测试版定义。

现在您应该可以在您的 c# 项目中使用 travis。

【讨论】:

这可能是我在这个网站上见过的最好的答案之一。 嗨,我正在尝试通过 Travis CI 构建一个 fx4.5 项目,但不是 sudo installer -pkg。请帮我解决它吗?谢谢!看,travis-ci.org/Aimeast/TestForFirst/builds/13814315 language: objective-c 是该模板所必需的,因此它使用 OS X 主机。 ServiceBus、Queue 和 BrokeredMessage 出现 CS0246 错误(“找不到类型或命名空间名称”)。有什么想法吗? @Mati 是 Windows Azure 吗?我不认为这是单声道兼容的,但我敢打赌它可以在 AppVeyor ***.com/a/19164665/637783 上轻松运行【参考方案2】:

这是关键点 - 项目必须在 Mono 上运行。这主要适用于图书馆风格的项目(AWS SDK .NET 是一个很好的例子),尽管需要更多的开发工作和纪律。如果您正在为 Windows 平台(如 WPF 应用程序、Azure 云服务、Windows Phone/Store 应用程序甚至 ASP.NET Web API)开发项目,Linux 构建环境将无法正常工作。

AppVeyor CI 是针对 Windows 平台的托管持续集成服务,对开源项目是免费的。就像适用于 Windows 的 Travis CI!

您可以为 VS.NET 解决方案、自定义 MSBuild 项目、PSake 或批处理文件的任何 PowerShell 脚本设置构建过程。此外,AppVeyor 具有内置的工件管理和部署框架。

【讨论】:

@jbtule 虽然它不是对问题的直接答案,但它确实提供了价值,因为这个问题的一些访问者(例如我)可能对在单声道和 MS 上为 .net 构建服务器感兴趣.net 平台。 Ib 除了这篇文章,wercker 最近还推出了原生 .NET 支持:blog.wercker.com/2013/10/25/… 当我按下“注册”链接时,AppVeyor CI 给我一个 503 错误。第一印象不是很好...... +1 对于 AppVeyor,我最近为 .NET 4.5 应用程序设置了两个构建定义,它的设置非常简单,并且具有很大的灵活性。支持也非常敏感,我报告了一个错误,它在不到 24 小时内得到修复并投入生产。【参考方案3】:

Travis CI 现在supports C#。从该页面大量引用:

概述

C#、F# 和 Visual Basic 项目的设置如下所示:

language: csharp
solution: solution-name.sln
mono:
  - latest
  - 3.12.0
  - 3.10.0

脚本

默认情况下,Travis 将运行 xbuild solution-name.sln。 Xbuild 是一个构建工具,旨在实现 Microsoft 的 MSBuild 工具。要覆盖它,您可以像这样设置脚本属性:

language: csharp
solution: solution-name.sln
script: ./build.sh

NuGet

默认情况下,Travis 将运行 nuget restore solution-name.sln,它会从您的解决方案文件中恢复所有 NuGet 包。要覆盖它,您可以像这样设置安装属性:

language: csharp
solution: solution-name.sln
install:
  - sudo dosomething
  - nuget restore solution-name.sln

【讨论】:

这就是答案。简明扼要。【参考方案4】:

如前所述,Travis CI 有测试版support for C#。我可以直接使用。 nunit 也可以很容易地集成。 这是一个 .travis.yml 文件的小示例,它运行 nunit 测试并在至少一个单元测试失败时将构建标记为失败:

language: csharp
solution: ./src/yoursolution.sln

install:
  - sudo apt-get install nunit-console
  - nuget restore ./src/yoursolution.sln

script:
  - xbuild ./src/yoursolution.sln
  - nunit-console ./src/SomeLibrary.Tests/bin/Debug/SomeLibrary.Tests.dll

【讨论】:

谢谢,使用这个配置,我第一次能够在 travis 上运行它(GH 问题,更多细节github.com/o2platform/FluentSharp/issues/…) 这对我帮助很大,谢谢!我唯一添加的是最后的sudo: required。像魅力一样工作。【参考方案5】:

如果你想将 Travis CI 与 F#、GitHub 上的 FAKE 和 Packet 一起使用,那么推荐使用 F# ProjectScaffold:

http://fsprojects.github.io/ProjectScaffold

【讨论】:

以上是关于如何将 Travis-CI 与 C# 或 F# 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .Net 5.0 C# 或 F# 中编写以特定时间间隔定期运行的代码

在travis-ci中手动触发安全列表之外(或阻止列表内)的分支的构建

使用 svn repo 自动运行 Travis-ci?

如何在 Travis-CI 配置文件 (YAML) 中正确使用 curl?

如何将 HSM 加密与 C# 集成?

sh travis-ci或任何其他ci的自动语义版本控制