我在公司进行自动化。我们是一个C#工作坊。
目前,我正在从事自动构建。 NANT是流量控制工具。虽然尚未积极开发NANT(2012年6月 和github存储库未激活的最新二进制文件未激活),但MSBuild更好。因此,我更喜欢MSBuild,但退出NANT仍然值得怀疑-费用是多少?

我已经提出了一些利弊,但我知道集体智慧会更好。谢谢你的帮助!

更新:
我已经阅读了问题,但是第二个答案引起了我的关注。在构建机器上有多个.NET框架,会麻烦吗?

MSBuild

优点:

  • 商业支持
  • 社区正在成长
  • 与VS和TFS集成
  • 与.Net保持同步

  • 缺点:
  • 重写当前脚本
  • 人们不熟悉


  • NANT

    优点:
  • 已在使用中
  • 人们熟悉的

  • 缺点:
  • 很长时间(自2012年以来)未更新
  • 社区未激活
  • 缺少新的.Net支持
  • 最佳答案

    我们写了FlubuCore(重写Flubu)。它是一个开放源代码的C#库,用于使用C#代码构建项目和执行部署脚本。

    我看到的flubu的主要优点是:

  • .Net核心支持。
  • 易于学习和使用,因为您完全使用C#编写了构建脚本。
  • 流利的界面和智能感。
  • 很多内置任务(编译,运行测试,管理iis,创建部署程序包,发布nuget程序包,执行powershell脚本...)
  • 在脚本中编写您自己的自定义C#代码并执行。
  • 使用RunProgramTask在脚本中运行任何外部程序或命令。
  • 在buildscript中引用任何.net库或C#源代码文件。现在,还提供了在构建脚本中引用nuget包的选项。
  • 编写测试,调试构建脚本。
  • 在任何其他.net应用程序中使用flubu任务。
  • Web API可用于flubu。对于远程自动部署很有用。
  • 编写自己的flubu任务,并使用它们扩展flubu fluent接口(interface)。

  • 您可以在nuget上找到flubu:

    如果您需要.net项目,请搜索FlubuCore.Runner。

    如果您需要.net核心项目,请搜索dotnet-flubu

    在.net中如何使用flubu的示例:
    protected override void ConfigureBuildProperties(IBuildPropertiesContext context) {
     context.Properties.Set(BuildProps.NUnitConsolePath,
      @ "packages\NUnit.ConsoleRunner.3.6.0\tools\nunit3-console.exe");
     context.Properties.Set(BuildProps.ProductId, "FlubuExample");
     context.Properties.Set(BuildProps.ProductName, "FlubuExample");
     context.Properties.Set(BuildProps.SolutionFileName, "FlubuExample.sln");
     context.Properties.Set(BuildProps.BuildConfiguration, "Release");
    }
    
    protected override void ConfigureTargets(ITaskContext session) {
     var loadSolution = session.CreateTarget("load.solution")
      .SetAsHidden()
      .AddTask(x => x.LoadSolutionTask());
    
     var updateVersion = session.CreateTarget("update.version")
      .DependsOn(loadSolution)
      .SetAsHidden()
      .Do(TargetFetchBuildVersion);
    
     session.CreateTarget("generate.commonassinfo")
      .SetDescription("Generates common assembly info")
      .DependsOn(updateVersion)
      .TaskExtensions().GenerateCommonAssemblyInfo()
    
     var compile = session.CreateTarget("compile")
      .SetDescription("Compiles the solution.")
      .AddTask(x => x.CompileSolutionTask())
      .DependsOn("generate.commonassinfo");
    
     var unitTest = session.CreateTarget("unit.tests")
      .SetDescription("Runs unit tests")
      .DependsOn(loadSolution)
      .AddTask(x => x.NUnitTaskForNunitV3("FlubuExample.Tests"));
    
     session.CreateTarget("abc").AddTask(x => x.RunProgramTask(@ "packages\LibZ.Tool\1.2.0\tools\libz.exe"));
    
     session.CreateTarget("Rebuild")
      .SetDescription("Rebuilds the solution.")
      .SetAsDefault()
      .DependsOn(compile, unitTest);
    }
    
    //// Some custom code
    public static void TargetFetchBuildVersion(ITaskContext context) {
     var version = context.Tasks().FetchBuildVersionFromFileTask().Execute(context);
    
     int svnRevisionNumber = 0; //in real scenario you would fetch revision number from subversion.
     int buildNumber = 0; // in real scenario you would fetch build version from build server.
     version = new Version(version.Major, version.Minor, buildNumber, svnRevisionNumber);
     context.Properties.Set(BuildProps.BuildVersion, version);
    }
    

    NET中如何使用flubu的示例
    public class MyBuildScript : DefaultBuildScript
    {
        protected override void ConfigureBuildProperties(IBuildPropertiesContext context)
        {
            context.Properties.Set(BuildProps.CompanyName, "Flubu");
            context.Properties.Set(BuildProps.CompanyCopyright, "Copyright (C) 2010-2016 Flubu");
            context.Properties.Set(BuildProps.ProductId, "FlubuExample");
            context.Properties.Set(BuildProps.ProductName, "FlubuExample");
            context.Properties.Set(BuildProps.SolutionFileName, "FlubuExample.sln");
            context.Properties.Set(BuildProps.BuildConfiguration, "Release");
        }
    
        protected override void ConfigureTargets(ITaskContext context)
        {
            var buildVersion = context.CreateTarget("buildVersion")
                .SetAsHidden()
                .SetDescription("Fetches flubu version from FlubuExample.ProjectVersion.txt file.")
                .AddTask(x => x.FetchBuildVersionFromFileTask());
    
            var compile = context
                .CreateTarget("compile")
                .SetDescription("Compiles the VS solution and sets version to FlubuExample.csproj")
                .AddCoreTask(x => x.UpdateNetCoreVersionTask("FlubuExample/FlubuExample.csproj"))
                .AddCoreTask(x => x.Restore())
                .AddCoreTask(x => x.Build())
                .DependsOn(buildVersion);
    
            var package = context
                .CreateTarget("Package")
                .CoreTaskExtensions()
                .DotnetPublish("FlubuExample")
                .CreateZipPackageFromProjects("FlubuExample", "netstandard2.0", "FlubuExample")
                .BackToTarget();
    
        //// Can be used instead of CreateZipPackageFromProject. See MVC_NET4.61 project for full example of PackageTask
        //// context.CreateTarget("Package2").AddTask(x =>
                 x.PackageTask("FlubuExample"));
    
             var test = context.CreateTarget("test")
                .AddCoreTaskAsync(x => x.Test().Project("FlubuExample.Tests"))
                .AddCoreTaskAsync(x => x.Test().Project("FlubuExample.Tests2"));
    
             context.CreateTarget("Rebuild")
                 .SetAsDefault()
                 .DependsOn(compile, test, package);
    }
    

    }

    详细的介绍和文档可以在这里找到:
    https://github.com/flubu-core/flubu.core

    您可以在此处找到完整的示例:
    https://github.com/flubu-core/examples

    关于tfs - 选择构建工具: MSBuild, NANT还是其他工具?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40890522/

    10-15 06:23