0

0

C# Cake脚本文件 C#如何使用C# Make来定义构建任务

幻夢星雲

幻夢星雲

发布时间:2026-02-16 03:03:34

|

748人浏览过

|

来源于php中文网

原创

cake脚本本质是c#代码,由cake.exe编译执行;任务须用task("name")声明,依赖通过isdependenton()显式定义,推荐使用dotnet()而非已废弃的dotnetcorecli()。

c# cake脚本文件 c#如何使用c# make来定义构建任务

Cake脚本本质是C#,不是“C# Make”

Cake(C# Make)不是另一个构建工具,而是用C#写的构建脚本框架——Cake.exe 本身是.NET命令行宿主,它把你的 build.cake 当作C#代码编译执行。所谓“用C#定义任务”,就是直接写C#语法,调用Cake提供的DSL方法(比如 Task()DotNetBuild()),而不是去学一套新语言。

常见错误现象:CS0103: The name 'Task' does not exist in the current context —— 这通常是因为没加 #load "tools/Cake.Cake" 或没启用预处理器指令,或者用错了入口点(比如写了 public static void Main(),但Cake不走这个)。

  • 所有任务必须用 Task("name") 声明,不能用 void Build() 这类普通方法代替
  • build.cake 文件顶部要加 #tool "nuget:?package=Cake.DotNetTool&version=3.2.0"(如果用dotnet tool方式运行)或 #addin "Cake.Common"(传统packages.config方式)
  • 别在脚本里写 using static Cake.Common.Tools.DotNet.DotNetAliases —— Cake会自动注入常用别名,手动using反而可能冲突

Task() 的参数和执行顺序怎么控制

Cake的任务调度是显式依赖的,没有隐式“默认任务”或“按顺序执行”。Task() 返回的是 ICakeTaskBuilder,靠 .IsDependentOn().IsScheduled().Does() 组装逻辑。

使用场景:你想先 restore 再 build 再 test,但又不想把三件事塞进一个 Does() 里——这样不利于复用和调试。

  • 基础写法:Task("Build").IsDependentOn("Restore").Does(() => { DotNetBuild(...); });
  • 避免循环依赖:Task("A").IsDependentOn("B"); Task("B").IsDependentOn("A"); 运行时会直接报 Cake.Core.CakeException: Circular dependency detected
  • 条件跳过用 .WithCriteria(),比如 .WithCriteria(() => !BuildSystem.IsLocalBuild),比在 Does() 里写 if 更干净
  • 别在 Does() 里 throw 异常来“失败任务”——用 throw new InvalidOperationException() 是可以的,但更推荐 Error("message"),它会标记任务失败且不影响后续可选任务

DotNetCoreCLI vs DotNetTool:该用哪个命令封装

DotNetCoreCLI() 是旧版API(已标记为 obsolete),DotNet() 才是当前推荐的统一入口。二者参数结构不同,混用容易传错参数类型(比如 DotNetCoreBuildSettingsDotNetBuildSettings 不兼容)。

Ajelix
Ajelix

处理Excel和GoogleSheets表格的AI工具

下载

性能影响:用 DotNet() 调用 dotnet build 时,Cake会复用已启动的MSBuild节点(如果环境支持),而老接口可能每次新建进程。

  • 正确写法:DotNetBuild("./src/MyApp.sln", new DotNetBuildSettings { Configuration = "Release" });
  • 路径必须是相对 build.cake 的位置,不是当前工作目录——"./src/MyApp.sln" 可以,"src/MyApp.sln" 在某些平台会失败
  • 如果项目用了 <packagereference></packagereference> 方式引用 Cake.Common,确保 tools/ 目录下没有残留的 packages.config,否则 DotNet() 可能加载不到扩展

本地调试 build.cake 很麻烦?试试直接用 dotnet run

Cake脚本不能双击运行,也不能用VS“启动调试”直接跑——因为缺少宿主上下文。最简单有效的调试方式,是把它当普通C#项目看待:用 dotnet run 加上 --project 指向一个临时的 .csproj,再通过 ProcessArgumentBuilder 模拟命令行参数。

容易踩的坑:很多人试图在 build.cake 里加 #r "System.Diagnostics.Debug.dll" 然后 Debugger.Launch(),结果发现根本不会弹窗——Cake进程由 Cake.exe 启动,调试器无法附着。

  • 推荐做法:建一个 build-runner.csprojPackageReference 引入 Cake.Frosting,写个 Program.cs 调用 new CakeHost().UseContext<buildcontext>().Run(args)</buildcontext>
  • 或者更轻量:用 dotnet cake build.cake --verbosity=diagnostic,日志里能看到每一步的输入参数和环境变量
  • 别在 Does() 里写 Console.WriteLine() 查变量——用 Information("Value: {0}", value),它会受 --verbosity 控制,不会污染CI输出

真正卡住人的地方,往往不是语法,而是 Cake 的生命周期:脚本解析 → 任务注册 → 依赖拓扑排序 → 执行链触发。一旦某个 Task() 注册失败(比如名字重复、依赖不存在),整个流程就停在解析阶段,连第一行 Information() 都不会输出。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

811

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2023.10.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

181

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

114

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1462

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

382

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2222

2025.12.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.5万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号