记录使用 Cake 进行构建并制作 nuget 包

前段时间折腾了一下,总算是把我自己的图片缓存控件(https://github.com/h82258652/HN.Controls.ImageEx)发布到了 nuget 上,目前已经进入一个比较稳定的版本了,基本没有很严重的 bug 了。其实核心代码早就写完了,后期主要都在折腾持续集成以及自动构建(包含制作 nuget 包)。持续集成使用了 appveyor,园子里也有不少相关的资料,这里我就不说了。

在制作 nuget 包的过程中,我折腾了很久,最开始打算直接用 appveyor 的自动打包功能,但是在打包 UWP 的包时,打包出来的版本号一直都是 1.0.0,而 WPF 的就没这问题(这个已确认是 appveyor 的 bug,然而好久都还没有修复(lll¬ω¬))。另外包里的 dll 的版本号也不好统一控制,我发一次版本需要发 3 个 nuget 包,每个 nuget 包都有一个 dll,手动折腾版本号那不切实际的。

在经过一番调研之后,我终于发现了一个能满足我需求的工具,Cake,也叫 C# Make,是一个专门用来进行 .net 项目构建的工具。官方网站在此:https://cakebuild.net/

接下来就按着教程开始吧。

640?wx_fmt=png

这个是我项目的根目录。接下来我们在此目录运行 Powershell(可以通过左上角的文件 –> 打开 Windows Powershell 来打开)。然后输入以下命令。

Invoke-WebRequest https://cakebuild.net/download/bootstrapper/windows -OutFile build.ps1

然后敲下回车,稍微等待之后,我们的目录下就会出现一个叫 build.ps1 的文件。

640?wx_fmt=png

接下来我们在该目录创建一个叫 build.cake 的空白文件,这个文件主要就是执行构建的逻辑。

然后在宇宙最强的 IDE,Visual Studio 中进行编写脚本吧,在这里,建议各位看官先安装一个插件:

640?wx_fmt=png

安装之后,Visual Studio 就具备对 .cake 脚本的语法高亮能力(可惜还是没法有语法提示功能/(ㄒoㄒ)/~~)。

使用 Visual Studio 打开 build.cake 之后,先编写个 Hello world 热热身:

var target = Argument("target", "Default");

Task(
"Default")
.Does(()
=>
{
Information(
"Hello World!");
});

RunTarget(target);

然后保存并运行刚才的 build.ps1。(Powershell 里输入 .\build.ps1

如果运气好的话,那么你应该和我一样碰到了这样的情况:

640?wx_fmt=png

这是由于执行 Powershell 脚本是一直比较危险的操作,所以需要更改权限。

输入如下的脚本:

640?wx_fmt=png

或者可以参考微软的官方文档来修改权限:https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-6

接着再次执行脚本,应该就可以看见如下信息。

640?wx_fmt=png

我们的 Hello world 终于跑起来了,热身完毕,接下来开始编写构建脚本。

Cake 脚本是由一个个 Task 串联起来的,我们先定义一些变量和一个叫 Build 的 Task,用于执行构建。

var target = Argument("target", "Default");
var configuration
= Argument("configuration", "Release");
var verbosity
= Argument("verbosity", Verbosity.Minimal);

var solution
= "./HN.Controls.ImageEx.sln";

Task(
"Build")
.Does(()
=>
{
if(IsRunningOnWindows())
{
// Use MSBuild
MSBuild(solution, configurator
=>
configurator.SetConfiguration(configuration)
.SetVerbosity(verbosity));
}
else
{
// Use XBuild
XBuild(solution, configurator
=>
configurator.SetConfiguration(configuration)
.SetVerbosity(verbosity));
}
});


Task(
"Default")
.IsDependentOn(
"Build");

RunTarget(target);

这里定义了一些变量,configuration 定义为 Release,在 Build Task 里用到,设置为使用 Release 模式。verbosity 表示编译时的信息输入,这里设置为 Minimal,以免输出过多的信息。solution 表示解决方案的路径。然后运行:

640?wx_fmt=png

这样一执行就把这个解决方案构建了一遍。

然后我们开始编写打包的 Task,命名为 Package。修改脚本如下:

var target = Argument("target", "Default");
var configuration
= Argument("configuration", "Release");
var verbosity
= Argument("verbosity", Verbosity.Minimal);
var version
= Argument("version", "1.0.0");

var solution
= "./HN.Controls.ImageEx.sln";

Task(
"Build")
.Does(()
=>
{
if(IsRunningOnWindows())
{
// Use MSBuild
MSBuild(solution, configurator
=>
configurator.SetConfiguration(configuration)
.SetVerbosity(verbosity));
}
else
{
// Use XBuild
XBuild(solution, configurator
=>
configurator.SetConfiguration(configuration)
.SetVerbosity(verbosity));
}
});

Task(
"Package")
.IsDependentOn(
"Build")
.Does(()
=>
{
var nuGetPackSettings
= new NuGetPackSettings
{
Version
= version
};

var nuspecFiles
= GetFiles("./src/*/*.nuspec");
NuGetPack(nuspecFiles, nuGetPackSettings);
});

Task(
"Default")
.IsDependentOn(
"Package");

RunTarget(target);

在这里我加了一个 version 的变量,在下面打包 nuget 包的时候会用到,统一每个 nuget 包的版本号。GetFiles("./src/*/*.nuspec") 这个则获取了源文件夹下面的项目下的 nuspec 文件(我这里一个 nuspec 对应一个 csproj,就放到同一个文件夹下了),这个文件的作用是用于描述 nuget 包如何进行打包,具体可以参考本文开头指向的上一篇文章。

执行之后,我们会得到些 nuget 包(当然对于看官你们的项目需要有 nuspec 才行啦):

640?wx_fmt=png

编译、打包都说完了。最后就是版本号的问题。nuget 包的版本在上面已经解决了,现在就是 dll 的版本号比较棘手。在我这三个项目中,WPF 和 UWP 都是传统的项目,都是有一个 AssemblyInfo.cs 的文件,然后里面通过 AssemblyVersionAttribute 来设置 dll 的版本号的。但是我这个 Core 的项目是新类型的项目,并没有 AssemblyInfo.cs 文件,版本号是在 csproj 里设置的。这难道没办法了么,最后通过万能的 Google 和 StackOverflow,我还是找到了办法。编辑 csproj 文件,并添加下面一节。

640?wx_fmt=png

这样,这个项目的版本号等信息就不会从 csproj 里面读取。我们可以添加自己的 AssemblyInfo.cs 文件进行版本号管理。

现在情况就是每个项目都有自己的 AssemblyInfo.cs 了,如何统一使用一个 AssemblyInfo.cs 文件来管理这几个项目呢?还记得 Visual Studio 有一个添加引用文件的功能么?

640?wx_fmt=png

这样几个项目都通过这种方式引用同一个 AssemblyInfo.cs 文件就行了。

最后的问题就是如何将 AssemblyInfo.cs 里的版本号跟 build.cake 脚本里的版本号保持一致。在查阅 Cake 的官方文档后,我发现有一个能生成 AssemblyInfo 的功能。修改我们的 build.cake 脚本:

var target = Argument("target", "Default");

var configuration = Argument("configuration", "Release");
var verbosity
= Argument("verbosity", Verbosity.Minimal);
var version
= Argument("version", "1.0.0");

var solution
= "./HN.Controls.ImageEx.sln";

Task(
"Version")
.Does(()
=>
{
var file
= "./src/SolutionInfo.cs";
CreateAssemblyInfo(file, new AssemblyInfoSettings
{
Version
= version,
FileVersion
= version,
InformationalVersion
= version
});
});

Task(
"Build")
.IsDependentOn(
"Version")
.Does(()
=>
{
if(IsRunningOnWindows())
{
// Use MSBuild
MSBuild(solution, configurator
=>
configurator.SetConfiguration(configuration)
.SetVerbosity(verbosity));
}
else
{
// Use XBuild
XBuild(solution, configurator
=>
configurator.SetConfiguration(configuration)
.SetVerbosity(verbosity));
}
});

Task(
"Package")
.IsDependentOn(
"Build")
.Does(()
=>
{
var nuGetPackSettings
= new NuGetPackSettings
{
Version
= version
};

var nuspecFiles
= GetFiles("./src/*/*.nuspec");
NuGetPack(nuspecFiles, nuGetPackSettings);
});

Task(
"Default")
.IsDependentOn(
"Package");

RunTarget(target);


在 Version Task 中,会生成一个 SolutionInfo.cs 的文件,也就相当于前面的 AssemblyInfo.cs。那现在所有的项目都引用这个文件来进行统一的版本管理就行了。 

这样就已经实现了统一版本、构建、打包的一件脚本化了。后续还可以添加上构建完之后执行单元测试以及打包后自动发布到 nuget 的功能,但我自己比较习惯打包完之后本地也测试一下(毕竟 nuget 发了就不能删),所以就暂时不折腾这功能了。

博主图片缓存控件项目的 build.cake 脚本可以参考这里:https://github.com/h82258652/HN.Controls.ImageEx/blob/master/build.cake,虽然配置好了 xunit,但是没有写单元测试就是了,ε=ε=ε=┏(゜ロ゜;)┛

这篇博文主要记录操作步骤,方便以后自己(我还有个微博的库的坑想要填……)。但也希望看完这篇博文的各位,制作一个 nuget 包并不是一件难事,马上行动把珍藏都弄一份 nuget 包,让各位 .net 开发者也机会用上吧。

原文地址:https://www.cnblogs.com/h82258652/p/10625036.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021牛客暑期多校训练营6

题号题目知识点AContracting Convex HullBDefend PonyvilleCDelete EdgesDGambling MonsterEGrowing TreeFHamburger SteakGHasse DiagramHHopping RabbitIIntervals on the RingJDefend Your CountryKStarch Cat

DDD领域驱动设计理论篇 - 学习笔记

一、Why DDD?在加入X公司后,开始了ASP.NET CoreDockerLinux的技术实践,也开始了微服务架构的实践。在微服务的学习中,有一本微软官方出品的《.NET微服务:容器化.NET应用架构指南》是我们学习的葵花宝典,纵观微软官方放…

Intervals on the Ring

Intervals on the Ring 题意: 给出环上的一组区间,需要构造环上的一组区间使得这些区间的交是给定的区间的并 题解: 集合的摩尔定理告诉我们:∪Ai‾∩Ai‾\overline{\cup A_{i}}\cap\overline{A_{i}}∪Ai​​∩Ai​​&#xf…

CodeForces 516E Drazil and His Happy Friends(数学+最短路)

problem 洛谷链接 solution 记 gcd⁡(n,m)d\gcd(n,m)dgcd(n,m)d,则快乐只会在同余 ddd 的关系中传递。 ixn≡ixs⋅d≡i(modd),iym≡iyt⋅d≡i(modd)ixn\equiv ixsd\equiv i\pmod d,iym\equiv iytd\equiv i\pmod dixn≡ixs⋅d≡i(modd),iym≡iyt⋅d≡i(modd)。 所…

.NetCore使用skywalking实现实时性能监控

一、简介很久之前写了一篇 《.Net Core 2.0 InfluxDBGrafanaApp Metrics 实现跨平台的实时性能监控》关于NetCore性能监控的文章,使用InfluxdbAppMetrics进行项目性能监控,由于技术有限,在正式环境使用一段时间后,莫名的AppMetric…

Hamburger Steak

Hamburger Steak 题意: 有m个锅,n块肉,每个肉需要煎ai分钟才能熟,每个锅同时最多煎一块肉,一块肉最多可以被两个锅煎(但不能同时),问最少多长时间能全部煎熟,并输出方案 题解: 我…

「ROI 2017 Day 2」反物质(单调队列优化dp)

problem LOJ2772 solution 这道题求的是“保证最多”,这个“保证”真的屑啊! 因为我们无法确定实验生成的克数,所以我们应当计算的是最坏情况。 又因为我们可以选择做哪些实验,所以要的是所有实验组合最坏情况下的最大价值。…

netcore开发windows普通服务(非Web)并一键发布到服务器

netcore下开发windows服务如果是web项目的话,由于aspnetcore本身是支持的,把默认的host.Run改为host.RunAsService就可以了。但是普通的netcore的控制台项目我终于找到了如下方式来实现:Microsoft.Extensions.HostingSystem.ServiceProcess.S…

Hopping Rabbit

Hopping Rabbit 题意: 给你n个矩阵,每个矩阵(给出左上标和右下标),现在让你给出一个点的位置,这个点每次只能上下左右四个方向移动,且移动距离为d,是否存在一个这样的点,其所有落点都不在矩阵…

删好串(区间dp)

problem 定义长度为 nnn 的“好”的串 aaa 满足: ∣ai−ai−1∣1,i∈[2,n]|a_i-a_{i-1}|1,i\in[2,n]∣ai​−ai−1​∣1,i∈[2,n]。ai≥ai−1ai12,i∈[2,n−1]a_i\ge \frac{a_{i-1}a_{i1}}{2},i\in[2,n-1]ai​≥2ai−1​ai1​​,i∈[2,n−1]。 给定长度为 nnn 的序…

直播预告 - 微软MVP为你揭秘Visual Studio 2019新特性

作为"宇宙第一IDE“的Visual Studio集成开发环境,已经经历了超过十几年的迭代成为一款功能丰富且高效的开发工具,微软自己给Visual Studio 的定位是 “更快、更可靠,对个人和团队更具生产力,更易于使用,并且更容易…

Delete Edges

Delete Edges 题意&#xff1a; 给出一个n个点的完全图&#xff0c;删一些三元环使得边数<n 输出所删的三元环 3<n<2000 题解&#xff1a; 肯定是结论题&#xff0c;但是我不会。。 结论&#xff1a;xyz0(mod n)1<x<y<z<n所有解即可 证明过程可以看看…

.NET 机器学习生态调查

机器学习是一种允许计算机使用现有数据预测未来行为、结果和趋势的数据科学方法。 使用机器学习&#xff0c;计算机可以在未显式编程的情况下进行学习。机器学习的预测可以使得应用和设备更智能。 在线购物时&#xff0c;机器学习基于历史购买推荐你可能喜欢的其他产品。 刷信用…

图中异色点对最短距离(最小生成树+线段树)

problem 给定一个 nnn 个点&#xff0c;mmm 条边的无向连通图&#xff0c;图有边权&#xff0c;每个点有一个颜色。 有 qqq 次操作&#xff0c;每次操作可更改某一个点颜色。 求每次操作后图中不同颜色点之间的最短距离。 若图中点颜色全相同&#xff0c;输出 000。 一行给…

Defend Your Country

Defend Your Country 题意&#xff1a; n个点&#xff0c;m条边的简单无向连通图&#xff0c;每个点一个权值ai,一个连通块的贡献&#xff1a;(−1)块内点数∗∑ai[点i在该连通块内](-1)^{块内点数}*\sum a_{i}[点i在该连通块内](−1)块内点数∗∑ai​[点i在该连通块内] 可以…

SkyWalking Liunx 环境搭建NetCore接入

背景前两天看见有小哥介绍windows下安装skywalking的介绍地址。正好最近也在搭建linux环境的SkyWalking&#xff0c;顺便把linux环境搭建的经验分享下&#xff0c;帮助下使用linux部署DotNetCore项目的同学。介绍SkyWalking是开源的apm工具&#xff0c;服务器端使用java编写&am…

AtCoder 2305 [AGC010D] Decrementing(博弈)

problem Luogu链接 solution case1&#xff1a;aaa 中如果有 111 的存在&#xff0c;那么相当于第二步失效&#xff0c;最后的结果仅由 ∑ai−1\sum a_i-1∑ai​−1 的奇偶性决定&#xff08;奇数先手赢&#xff0c;偶数后手赢&#xff09; 奇数先手赢&#xff0c;偶数后手…

P4568 [JLOI2011]飞行路线

P4568 [JLOI2011]飞行路线 题意&#xff1a; n个城市&#xff0c;m个航班&#xff0c;你有k次免费坐航班的机会&#xff0c;问从s到t最少花费是多少&#xff1f; 题解&#xff1a; 分层图问题 简单说说什么是分层图&#xff1a; 其实就是将一个平面的图重新建图&#xff0c…

.NET 基金会完成第一次全面改选

.NET基金会是一个独立的组织&#xff0c;支持.NET社区和开源&#xff0c;旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成&#xff0c;包括项目指导&#xff0c;指导&#xff0c;法律和营销帮助&#xff0c;技术和财务支持设置等&#xff0c;2014年微软组织成立.NET…

一般图带权多重匹配(欧拉图+最小费用流)

problem 给定 nnn 个数 {ai}\{a_i\}{ai​}&#xff0c;其中 kkk 个 aia_iai​ 是奇数&#xff0c;再给一个 nnn\times nnn 的矩阵 {ci,j}\{c_{i,j}\}{ci,j​}&#xff0c;无论是 aaa 还是 ccc&#xff0c;都保证是非负整数。 现在可以做一类操作&#xff1a;将 ai−1,aj−1a_…