【问题标题】:How to build a mixed (C++ + C#) solution with Travis CI?如何使用 Travis CI 构建混合 (C++ + C#) 解决方案?
【发布时间】:2016-01-04 00:41:29
【问题描述】:

我有 4 个项目的解决方案:

  • 一个 C++ .lib "A"
  • 一个 C++ .dll(基于 SWIG 生成的包装器)“AWrapper”
  • 一个 C# .dll(基于 SWIG 生成的包装器)“ASharp”
  • 一个 C# 单元测试项目(默认,但我可以将它移植到 NUnit)“ASharpTests”

看着general documentationC# Travis CI docsC++ docs 不知道如何解决这样的多语言项目问题。

我可以为 C++ 库和包装器创建 CMake 项目。但是接下来我该怎么做,如何解决接下来的问题:

  • 如何仅编译 VS 解决方案中选定的项目?
  • 如何混合多种语言,应将哪些内容写入 Travis 配置(2 个 C++ 项目、2 个 C# 项目,以运行测试,因此从 C++ 代码构建的 .so 必须与 C# 测试位于同一文件夹中)?

【问题讨论】:

    标签: c# c++ visual-studio travis-ci


    【解决方案1】:

    我建议您将 Travis 配置设置为 C#(即language: csharp)。有了这个,您的项目将与所有必要的工具集成到 C# 环境中。对于您的两个 C++ 项目,安装必备工具应该不会太难。它就像sudo apt-get install g++ cmake(和其他必需的软件包)一样简单。您必须在 .travis 文件的 install 部分执行此操作。

    注意:安装缺失包的具体方式可能会有所不同,具体取决于您使用的是the docker-based Travis infrastructure 还是the legacy one

    然后,在script 部分,您可以使用 cmake 构建您的 c++ 项目,然后构建您的 C# 项目。

    【讨论】:

      【解决方案2】:

      CI 构建工具 - MSBuild

      如果您使用 Visual Studio 构建您的 C++/C#/VB/其他解决方案,您应该使用 MSBuild 作为 CI 构建工具。 见:https://msdn.microsoft.com/en-us/library/dd393574.aspx

      MSBuild 可用于在 Visual Studio 中构建项目文件(.csproj、.vbproj、vcxproj 等)。但是,不建议这样做。相反,MSBuild 应该直接构建 Visual Studio 解决方案 (.sln)。主要原因是Visual Studio IDE(开发人员使用)和MSBuild命令行(CI系统使用)构建解决方案的方式完全相同。其次,使用 IDE 中的配置管理器更改项目时,更改配置只会在一处。

      MSBuild XML 脚本示例:

      <Target Name="BUILD_SOLUTION">         
          <MSBuild Projects="$(SOLUTION_NAME).sln" Properties="Configuration=Release;Platform=Win32"/>
          <MSBuild Projects="$(SOLUTION_NAME).sln" Properties="Configuration=Release;Platform=x64"/>
      </Target>
      

      记得设置项目依赖和检查项目构建顺序。例如,

      • 在最终 EXE 项目之前构建的公共库;
      • 在相应的生产项目之后构建的单元测试项目。

      MSBuild Properties="Configuration=x;Platform=y" 映射到配置管理器。请记住设置所有配置和平台组合:

      • 如果需要,选择(启用复选框)为每个项目上下文构建;
      • 未使用部署列。

      【讨论】:

      • MSBuild 不适用于 github 项目,而且我需要我的项目是跨平台的......添加了详细信息。
      • Visual Studio Online 可能适合您。在 Visual Studio Online 中构建 GitHub 托管的项目:msdn.microsoft.com/Library/vs/alm/Build/github/index
      • 我认为自从发布/接受此答案以来,时代已经过去了。我使用 Appveyor 编译公共 C++ 项目,同时使用批处理脚本和 CMake 项目生成。生成项目后,我会构建特定的目标。即 cmake --build --target INSTALL --config Release|Debug。这是我使用 AppVeyor 运行的项目:github.com/SuperEvenSteven/PSMoveSteamVRBridge/blob/master/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多