.net Visual Studio(.sln)生成运行程序和MSBuild之间的差异

.net Visual Studio(.sln)生成运行程序和MSBuild之间的差异,.net,visual-studio,msbuild,continuous-integration,teamcity,.net,Visual Studio,Msbuild,Continuous Integration,Teamcity,我正在尝试将TeamCity设置为使用.Net执行CI,并配置我拥有的构建运行程序: Visual Studio(sln) MSBuild VisualStudio2003 有什么区别?为什么三个构建在同一类型的项目上工作?(除了2003年,我认为这只是2003年,为什么?) 考虑到这个问题,我们为.exe文件提供了以下生成运行程序: .NET进程运行程序 命令行 “命令行”生成运行程序不适用于任何.net程序集?为什么使用.Net进程运行程序?Visual Studio(sln) 如果您的解决

我正在尝试将TeamCity设置为使用.Net执行CI,并配置我拥有的构建运行程序:

  • Visual Studio(sln)
  • MSBuild
  • VisualStudio2003
  • 有什么区别?为什么三个构建在同一类型的项目上工作?(除了2003年,我认为这只是2003年,为什么?)

    考虑到这个问题,我们为.exe文件提供了以下生成运行程序:

  • .NET进程运行程序
  • 命令行
  • “命令行”生成运行程序不适用于任何.net程序集?为什么使用.Net进程运行程序?

    Visual Studio(sln)
    如果您的解决方案很小,并且您不需要做一些花哨的事情,那么您可以使用VisualStudio(sln)build runner。它的作用与您执行Project->Build(从VS菜单)时完全相同。此选项非常容易配置,只需单击几下,您的CI服务器即可编译您的解决方案

    MSBuild

    如果您需要执行更高级的场景,除了简单的编译之外,比如应用不同的配置文件、将转换后的值插入配置文件、部署二进制文件等,那么您可以选择MSBuild选项。您将知道何时需要使用它,因为sln builder将无法完成这些工作。此选项需要对生成脚本语言有一定的了解,它是一种基于任务且类似xml的语言。

    如果您使用解决方案文件(Visual Studio)的方式,这意味着您需要为生成服务器授权一份Visual Studio副本,并附带安装/维护。如果您使用的是MSBuild,那么您不需要这些,只需要安装.net framework即可。两者之间唯一的真正区别是VisualStudio设置了各种环境变量,并利用了构建顺序等功能。虽然默认情况下MSBuild没有设置任何环境变量,并且不识别生成顺序,但它只重新定义依赖项。虽然在Visual Studio中,这会稍微容易一些,但您不会偶尔遇到依赖Visual Studio来掩盖某些粗枝大叶的情况。

    当您使用MSBuild生成.SLN文件(非MSBuild文档)时它生成内存中的MSBuild文件,该文件引用指定配置中要生成的所有项目,然后执行该文件。当您使用Visual Studio构建时,您将调用DevEnv.com

    有某些项目类型(C++ 2005/2008和2005/2008/2010中的VDPROJ),它们不是MSBug文件,不能使用MSBug构建。您将收到生成警告,指出一个或多个项目不是有效的MSBuild项目,无法生成


    总的来说,我试图维护精益和平均构建的机器,并且只在需要时安装Visual Studio。

    我很少注意到两者之间的差别。特别是在我们的实例中,我们需要构建一个.vdproj。现在,谷歌搜索了两个运行程序,命令行运行程序或VisualStudio(sln)。但是,在执行Visual Studio(sln)runner类型时,出现以下错误: [警告]C:\BuildAgent\work\1bd75058d7bca32b\POS\PoSWidgetInstaller\myInstaller.vdproj.metaproj警告MSB4078:MSBuild不支持项目文件“myInstaller\myInstaller.vdproj”,无法生成该文件

    而且它在解决方案中构建时不会失败。
    我认为VisualStudio(sln)运行程序类型从sln文件中提取数据,然后将其与MSbuild一起使用。不确定,我不能确认,但只是我的想法。

    谢谢你的回答。Visual Studio(sln)在后台使用MSBuild,而不是?VS可以生成MSBuild无法生成的某些项目类型(例如安装项目)。或者至少这是我在VS 2008中的经历——也许现在它更加同步了。@Acaz好吧,是的,但它对你来说是隐藏的。实际上,在VS(Project->Build)中使用MSBuild时,您并不知道这一点。同样的过程,为简单起见,您可以将CI配置为立即编译项目。还有一些工具,如OpenMake Build Meister,它可以更好地分析过时且需要重建的项目关系和目标,然后生成自己的MSBuild文件,以便更好地跨多个应用程序执行线程解决。例如,我在一个系统上工作,该系统有许多解决方案和数千个项目,我们能够大幅缩短构建时间。MSBuild是一个面向任务的构建工具。它可以编译、运行单元测试、部署二进制文件、归档、执行配置文件转换等。对于所有这些,它使用其他工具或库。例如,要编译C#解决方案,它使用scs.exe。要运行NUnit测试,可以使用NUnit-console.exe。简而言之,它是一个包装器,允许您自动构建、测试和部署产品的过程。我正在一台服务器上使用
    Visual Studio runner
    进行绿色构建,我在服务器上只安装了
    MSBuild工具
    Windows SDK
    ,这两个都是可以从MS站点下载的免费产品。你的意思是
    DevEnv.exe
    。否。查看Common7\IDE文件夹,您将看到一个DevEnv.exe和一个DevEnv.com。如果执行devenv.exe/?您将获得一个带有命令行选项的模式窗口。如果您使用devenv.com/?它将全部显示在标准输出上。如果执行回显%PATHEXT%,您将看到.COM列在.EXE之前。因此,当你在构建过程中调用DevEnv时,你实际上是在调用DevEnv.com,这样所有的stderr和stdout都可以被收集并处理到你的日志文件中。我要说,我在最后发表的精辟而中肯的评论反映了我在2005-2012年的观点。这是一个很好的目标,但不再实际。虽然MSFT拥有构建工具,并通过Nuget大量引入,但现实情况是,经常会出现一些边缘情况,您只需要安装完整的VisualStudio工作负载。我觉得有点悲哀,但事实就是这样。