英文 | 中文
FlubuCore
简介
"FlubuCore - Fluent Builder Core"是一个跨平台的构建和部署自动化系统。您可以使用直观的流畅接口在C#中定义构建和部署脚本。这为您的脚本提供了代码补全、智能感知、调试、FlubuCore自定义分析器,以及在脚本中直接访问整个.NET生态系统的能力。
FlubuCore提供了一个.NET(Core)控制台应用程序,使用Roslyn的强大功能来编译和执行脚本。上面的示例可以通过以下方式在控制台中运行:
- FlubuCore运行器(.NET 4.62+)
flubu.exe Default
- FlubuCore dotnet CLI工具(.NET Core 1.0+)
dotnet flubu Default
- FlubuCore本地或全局工具(.NET Core 2.1+)
flubu Default
特性和优势
- 直观易学。C#、流畅接口和智能感知使得即使是最复杂的脚本创建也变得轻而易举。
[FromArg("nugetKey", "用于发布Flubu nuget包的Nuget API密钥。")]
public string NugetApiKey { get; set; }
protected override void ConfigureTargets(ITaskContext context)
{
var pack = context.CreateTarget("Pack")
.SetDescription("准备nuget包。")
.AddCoreTask(x => x.Pack()
.NoBuild()
.OutputDirectory(OutputDirectory)
.WithArguments("--force")); //你可以在每个任务上添加自己的自定义参数
var branch = context.BuildSystems().Travis().Branch;
var nugetPush = context.CreateTarget("Nuget.publish")
.SetDescription("发布nuget包。")
.DependsOn(pack)
.AddCoreTask(x => x.NugetPush($"{OutputDirectory}/NetCoreOpenSource.nupkg")
.ServerUrl("https://www.nuget.org/api/v2/package")
.ApiKey(NugetApiKey)
)
.When(c => c.BuildSystems().RunningOn == BuildSystemType.TravisCI
&& !string.IsNullOrEmpty(branch)
&& branch.EndsWith("stable", StringComparison.OrdinalIgnoreCase));
}
- 大量常用的内置任务,如版本控制、运行测试、创建部署包、发布NuGet包、Docker任务、Git任务、SQL任务、npm任务、执行PowerShell、管理IIS脚本等等。
context.CreateTarget("build")
.AddTask(x => x.GitVersionTask())
.AddTask(x => x.CompileSolutionTask("MySolution.sln").BuildConfiguration("Release");
context.CreateTarget("run.tests")
.AddTask(x => x.XunitTaskByProjectName("MyProject").StopOnFail())
.AddTask(x => x.NUnitTask(NunitCmdOptions.V3, "MyProject2").ExcludeCategory("Linux"))
.AddCoreTask(x => x.CoverletTask("MyProject.dll"));
context.CreateTarget("DoExample")
.Do(c =>
{
// 编写你的精彩代码。
File.Copy("NotSoAwesome.txt", Path.Combine(OutputDirectory, "JustAnExample.txt") );
// 如果需要,在DO中访问flubu内置任务。
c.Tasks().GenerateT4Template("example.TT").Execute(c);
})
.AddTask(x => x.CompileSolutionTask())
.Do(NuGetPackageReferencingExample);
- 当脚本与项目文件一起使用时,程序集引用和nuget包会自动加载。当脚本单独执行时(例如在生产环境中使用FlubuCore脚本部署时),可以通过属性添加引用。
[NugetPackage("Newtonsoft.json", "11.0.2")]
[Assembly(".\Lib\EntityFramework.dll")]
public class BuildScript : DefaultBuildScript
{
public void NuGetPackageReferencingExample(ITaskContext context)
{
JsonConvert.SerializeObject("Example");
}
}
context.CreateTarget("Run.Libz")
.AddTask(x => x.RunProgramTask(@"packages\LibZ.Tool\1.2.0\tools\libz.exe")
.WorkingFolder(@".\src")
.WithArguments("add")
.WithArguments("--libz", "Assemblies.libz"));
public class SimpleScript : DefaultBuildScript
{
[FromArg("c", "用于构建项目的配置。")]
public string Configuration { get; set; } = "Release"
[FromArg("sn", "如果为true,则应用程序部署在第二个节点上。否则不部署。")]
public bool deployOnSecondNode { get; set; }
protected override void ConfigureTargets(ITaskContext context)
{
context.CreateTarget("build")
.AddCoreTask(x => x.Build()
.Configuration(Configuration)
.ForMember(x => x.Framework("net462"), "f", "要构建的目标框架。"));
}
}
flubu build -c=Debug -f=netcoreapp2.0
-
通过编写FlubuCore插件来扩展FlubuCore流畅接口。
public class ExampleFlubuPluginTask : TaskBase<int, ExampleFlubuPluginTask> { protected override int DoExecute(ITaskContextInternal context) { // 在这里编写你的任务逻辑。 return 0; } }
-
context.CreateTarget("Run.Tests") .AddTaskAsync(x => x.NUnitTaskForNunitV3("TestProjectName1")) .AddTaskAsync(x => x.NUnitTaskForNunitV3("TestProjectName1")) .AddTaskAsync(x => x.NUnitTaskForNunitV3("TestProjectName3"));
-
context.CreateTarget("Example")` .AddCoreTask(x => x.Build("MySolution.sln").Configuration("Release");
flubu example --configuration=Debug
flubu将执行
dotnet build MySolution.sln --configuration Debug
-
dotnet tool install --global FlubuCore.Tool flubu compile
-
FlubuCore交互模式提供目标自动完成、选项自动完成、切换目标/选项、执行命令历史。还可以执行外部命令和可操作程序。对于某些程序,FlubuCore提供开箱即用的自动完成功能,并在控制台底部显示帮助信息(如dotnet、git等)
-
context.WaitForDebugger();
-
为Azure pipelines、Github actions、Appveyor、Travis和Jenkins生成持续集成配置文件。
-
通过FlubuCore自定义分析器改善开发者体验。
入门
使用FlubuCore非常简单直观 :-) 它也有完整和详细的文档。
FlubuCore文档中的入门章节将帮助你快速设置第一个FlubuCore构建。 你也应该查看入门博客。它有一些更详细的内容,包含一些不错的技巧和窍门。 FlubuCore提供的功能完整列表及描述可以在构建脚本基础章节中找到。
一旦定义好构建和部署脚本,以下Wiki章节将解释如何运行它们:
- 对于.NET Framework项目,使用FlubuCore.Runner
- 对于.NET Core项目,使用FlubuCore CLI全局工具
示例
除了详细的Wiki,FlubuCore还提供了反映真实情况的示例项目。这些示例可以在单独的示例仓库中找到。
以下示例将帮助你快速入门FlubuCore:
-
.NET Framework构建示例 - 该示例涵盖了版本控制、项目构建、运行测试、打包应用程序以及其他一些基本用例。
-
.NET Core构建示例 - 该示例涵盖了版本控制、项目构建、运行测试、打包应用程序以及其他一些基本用例。
-
部署脚本示例 - 该示例展示了如何编写简单的部署脚本。
-
开源库示例 - 该示例涵盖了版本控制、项目构建、运行测试和发布NuGet包。它还涵盖了如何在Appveyor和Travis CI上运行构建脚本。
有问题吗?
贡献
请查看CONTRIBUTING.md。
贡献方式
- 我们非常感谢您提供的任何反馈!欢迎参与聊天或在问题跟踪器中添加问题。
- 宣传项目。
- 如果您喜欢这个项目,别忘了给它一个星星,这样社区就会变得更大。
- 改进文档。
- 报告、修复bug。
- 实现新功能。
- 讨论改进项目的潜在方法。
- 改进现有实现、性能等。
更新日志和路线图
带有描述和示例的更改可以在更新日志中找到。
您可以通过查看已打开的里程碑来了解FlubuCore的路线图。
进一步发展
如果您发现FlubuCore有用(您觉得它在日常工作中对您有帮助),您可以通过给我们买杯咖啡来支持进一步的开发(或成为赞助者或赞助商)。有时熬夜到深夜实现新功能很困难,咖啡可以帮助我们。我们非常感谢您的支持。赞助资金也将用于项目的推广。如果您是赞助者或赞助商,您还可以请求新功能或寻求支持。这些问题将被优先处理。
赞助者和赞助商
使用与支持
感谢Comtrade对我们的支持。
致谢
- 特别感谢@ironcev大大改进了自述文件并提供了一些宝贵的建议。
- 特别感谢@alexinea将整个文档翻译成中文。
- 特别感谢@huanlin用繁体中文撰写有关FlubuCore的博客并将其翻译成英文。
行为准则
本项目采用了贡献者公约定义的行为准则,以明确我们社区中的预期行为。 有关更多信息,请参阅.NET Foundation行为准则。
.NET Foundation
本项目得到了.NET Foundation的支持。