一、什么是 Cake
Cake(C# Make) 是一个使用 C# DSL 面向 Task 的跨平台构建自动化系统,像编译代码,复制文件和文件夹,运行单元测试,压缩文件和构建 NuGet 包。
更多内容请访问官网
二、使用 Cake
先尝试一下 Package 的例子
1. 创建一个类库项目
2. VS Code 添加 Cake 扩展
3. Ctrl + Shift + P ,输入 Cake ,然后选择 install to work space,这个会安装的最全
名字不改的话,按几下 Enter 键就可以了,然后你会发现项目里多了几个文件
tools 是 Cake.CoreCLR 的东西(如果引用其他的 tool 或者 addin 也会加到这里),build.cake 是 Windows 平台会调用的脚本, build.sh 是 Linux 平台会调用的脚本,这2个脚本都会调用 build.cake,cake.config 是 cake 的配置文件
然后在 build.cake 里写要执行的脚步就可以了
默认会有 2个 变量,一个会在所有 Task 执行之前调用的 Setup 方法,一个会在所有 Task 执行之后调用的 Teardown 方法,还有一个默认的 Task ,最后是调用上边的 RunTarget(target)
一般的流程会是 Clean -> Restore -> Build -> Test -> Package -> Publish,当然开发环境和生产环境步骤会有一点区别,正好就用最后的 RunTarget 来决定
target 的参数在运行 build.ps1 时可以指定,如 ./build.ps1 -Target Dev 就会运行 Task(“Dev”),不写就是Default,也可以只运行其中一个 Task ,./build.ps1 -t “Clean”
#tool nuget:?package=xunit.runner.console -Version 2.3.1
//////////////////////////////////////////////////////////////////////
// ARGUMENTS
//////////////////////////////////////////////////////////////////////
var
target = Argument(
"target"
,
"Default"
);
var
configuration = Argument(
"configuration"
,
"Release"
);
//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////
var
version = XmlPeek(csprojName ,
"/Project/PropertyGroup/Version/text()"
);
//这个是在 csproj 文件里写了 Version 信息,也可以用其他方式
var
buildId = GitLabCI.Environment.Build.Id;
//取 GitLab 的构建号,这样每次打包的 Nuget 包就不会重复了
var
buildDir = Directory(
"./src/**/bin"
) + Directory(configuration);
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
Task(
"Clean"
)
.Does(() =>
{
CleanDirectory(buildDir);
});
Task(
"Restore-NuGet-Packages"
)
.IsDependentOn(
"Clean"
)
.Does(() =>
{
NuGetRestore(./src/Test.sln);
//solution 文件,也可以是 project 的名字,如果你只想编译其中一个 project
});
Task(
"Build"
)
.IsDependentOn(
"Restore-NuGet-Packages"
)
.Does(() =>
{
if
(IsRunningOnWindows())
{
MSBuild(./src/Test.sln, settings => settings.SetConfiguration(configuration));
//solution 文件,也可以是 project 的名字,如果你只想构建其中一个 project
}
else
{
XBuild(./src/XXX.sln, settings => settings.SetConfiguration(configuration));
//solution 文件,也可以是 project 的名字,如果你只想构建其中一个 project
}
});
Task(
"Run-Unit-Tests"
)
.IsDependentOn(
"Build"
)
.Does(() =>
{
XUnit(
"./src/**.Test/bin/"
+ configuration +
"*/.Test.dll"
,
new
XUnitSettings
{
HtmlReport =
false
,
XmlReport =
true
,
OutputDirectory =
"./build"
});
});
Task(
"Package"
)
.IsDependentOn(
"Run-Unit-Tests"
)
.Does(()=>
{
if
(projectName !=
""
)
{
NuGetPack(
new
NuGetPackSettings
{
Id =
"Test Id"
,
Title =
"Test Title"
,
Version = version +
"."
+ buildId,
Description =
"Test Description"
,
Authors =
new
[] {
"Test Author"
},
Files =
new
[]
{
new
NuSpecContent {Source = projectName +
".dll"
, Target =
"lib/netcoreapp2.0"
},
new
NuSpecContent {Source = projectName +
".pdb"
, Target =
"lib/netcoreapp2.0"
},
},
BasePath =
"./src/*/bin/Release/netcoreapp2.0"
,
OutputDirectory =
"./src/*/bin/Release"
});
}
});
Task(
"Publish"
)
.IsDependentOn(
"Package"
)
.Does(()=>
{
if
(projectName !=
""
)
{
var
nugetSettings =
new
NuGetPushSettings
{
ApiKey = EnvironmentVariable(
"NUGET_API_KEY"
),
Source = EnvironmentVariable(
"NUGET_SOURCE"
),
Verbosity = NuGetVerbosity.Detailed
};
// 这里的 EnvironmentVariable 是在 GitLab 里设置了,其他的 CI 工具里也都有相应的设置,如果是本地,可以在 Nuget 的配置文件里设置好
NuGetPush(
"./src/*/bin/"
+ configuration +
"/*."
+ version +
"."
+ buildId +
".nupkg"
, nugetSettings);
}
});
////////////////////////////////////////////////////////////////////
//TASK TARGETS
////////////////////////////////////////////////////////////////////
Task(
"Default"
)
.IsDependentOn(
"Publish"
);
Task(
"Dev"
)
.IsDependentOn(
"Run-Unit-Tests"
);
////////////////////////////////////////////////////////////////////
//EXECUTION
////////////////////////////////////////////////////////////////////
RunTarget(target);
|
以上就可以使用了,但是还有一些其他的细节
//错误信息输出,比如 Clean 出错
Task(
"Clean"
)
.Does(() =>
{
CleanDirectory(buildDir);
})
.OnError(exception =>
{
Error(exception.Message);
Information(
"Clean Task failed"
);
});
//目录是否存在
DirectoryExists();
//文件是否存在
FileExists();
//路径是否存在
PathExists();
|
这些可以根据需要灵活添加
DoNetCore 网站的例子也都差不多,这里只列出区别的地方
//Restore
DotNetCoreRestore();
//Build
DotNetCoreBuild(
"./src/Test.sln"
);
//test
DotNetCoreTest(
"url"
);
// package
DotNetCorePulish(
"./src"
,
new
DotNetCorePublishSettings
{
OutputDirectory =
"publish"
});
//确认文件夹存在
EnsureDirectoryExists(packageOutputPath);
//Publish
Zip(
"publish"
,$
"{packageOutputPath}/Test.{version}.zip"
);
//Upload
CurlUploadFile($
"{packageOutputPath}/Test.{version}.zip"
,
new
Url(
""
)
,
new
CurlSettings
{
RequestCommand =
"POST"
,
Username =
"user"
,
EnvironmentVariable(
""
),
Password =
"password"
,
ArgumentCustomization= args=> args.Append(
"--fail"
)
});
|
原文地址:https://www.cnblogs.com/heyixiaoran/p/8975137.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com