手把手教你如何构建 WPF 官方开源框架源代码
从去年微软就将 WPF 开源了,差不多现在所有 WPF 的源代码都开源了。在学习框架的时候,我会做一些改动,期望能构建一个自己的版本进行测试。但是作为一个特别大的框架,想要构建跑起来可不是直接在 VisualStudio 里面点击一下运行就完成了,需要做很多的准备才可以。本文将一步步教你如何构建 WPF 框架源代码
我不敢说每个版本的 WPF 框架的源代码我都能构建,在官方仓库 https://github.com/dotnet/wpf 我构建成功的版本是这个 commit 小伙伴可以尝试使用本文的方法,先切的这个 commit 按照我的方法来进行构建,成功了之后再做更新版本的尝试
阅读本文能让你了解如何构建WPF框架 https://github.com/dotnet/wpf源代码,但是不确保你一定能构建成功
构建 WPF 的步骤如下:
- 下载构建需要的依赖库
- 还原 NuGet 包
- 按照顺序构建 C++ 和 C# 代码,创建 NuGet 包
这里面对于咱国内的小伙伴,最坑的问题就是下载构建需要的库,需要的库如下
- dotnet-sdk-5.0.100-preview.1.20155.7-win-x64.zip 安装
- dotnet-runtime-5.0.0-preview.4.20220.15-win-x86.zip 安装
- strawberry-perl-5.28.1.1-1-win64-x64.zip 放到
.netcoreeng\native\temp
文件夹 - net-framework-48-ref-assemblies-0.0.0.1-win64-x64.zip 放到
.netcoreeng\native\temp
文件夹 - dotnet-api-docs_netcoreapp3.0-0.0.0.2-win64-x64.zip 放到
.netcoreeng\native\temp
文件夹 - msvcurt-c1xx-0.0.1.2-win64-x64.zip 放到
.netcoreeng\native\temp
文件夹 - net-framework-472-iltools-0.0.0.1-win64-x64.zip 放到
.netcoreeng\native\temp
文件夹 - dotnet-runtime-2.1.7-win-x86.zip 安装
上面说的 .netcoreeng\native\temp
文件夹就是在用户名下的如 C:\Users\lindexi\.netcoreeng\native\temp\
文件夹
这些文件都是十分大的,同时有一些文件会下载放在系统的临时文件夹,如果一开始下载失败了,第二次不会进行校验,只会出现 IO 解压缩错误,此时就需要小伙伴清空自己的系统临时文件夹,用户临时文件夹和 C:\Users\lindexi\.netcoreeng\native\temp\
文件夹
在进行构建的时候还需要让 VisualStudio 安装了差不多所有能装的负载,毕竟需要构建 C++ 这样的东西,这对 VisualStudio 版本也有要求。最低的 VisualStudio 要求是 16.4 版本
当前,我肯定不会一开始说这么劝退的方法,在本地构建的失败率太高了,即使是我全用梯子下载,也没有成功,因为有一点是在于构建的代码里面,微软的小伙伴认为网速都是特别快的,没有在一定的时间内下载完成就是失败。而我基本上每次都是下载到失败。同时失败之后下一次没有做校验,也就是除非我全部删除了重新下载,否则可能因为下载不完成构建一半翻车
一个简单的方法是利用 GitHub 的 Action 构建,感谢微软,微软收购了 GitHub 给了大量土豪的支持,所有小伙伴只要创建 GitHub 账号都能免费使用 GitHub 的 Action 构建代码。而构建的服务器可以选择 Windows 全环境服务器,在服务器里面安装了最新的 VisualStudio 和所有的负载,功能齐全,下载安装网速基本有 100M 一秒的速度。重要的是这么强大的服务器还是免费使用,不要钱,只要编写构建脚本就会自动执行
好,差不多广告费到手了,下面让我告诉大家如何使用 GitHub 的 Action 构建 WPF 的框架源代码
在开始之前先说为什么
原因一在于环境,因为 WPF 代码包含一部分 C++ 代码,这部分代码特别调环境。需要差不多将 VisualStudio 的全部功能安装才能。我就在这里翻车了,我就少安装了一个,然后就翻车了,但是很难猜到是少安装了,因为提示很诡异。虽然我就一句话,给 VisualStudio 按照全部功能,但是我预计你不会听我的
原因二在于网速,要下载的包还是大了一点,同时还原 NuGet 的服务器也没有国内源
刚好 GitHub 的 Action 都能满足条件,包含了全部环境,下载速度特别快
使用 GitHub 的 Action 的方法就是创建一个构建清单文件,放在 .github\workflows\
文件夹里面。清单文件是 yml 格式,如 dotnetcore.yml 文件
这个清单文件的格式不是咱的重点,理论上小伙伴看了代码大概就能理解了,不需要去学习
name: .NET Core
on: [push]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v1
- name: Install Nuget
uses: nuget/setup-nuget@v1
with:
nuget-version: '5.x'
- name: Build
run: .\build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86
没错,将这个清单文件放在清单文件夹里面,如 这个 commit 的做法 就可以让 WPF 构建起来
上面的清单文件也是最简单的让 WPF 构建的代码了,核心代码是 .\build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86
通过这句代码就可以调用微软小伙伴写好的脚本进行构建
在日志里面看到输出构建了 nupkg 文件就是构建成功
2020-04-23T04:00:24.5493423Z Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\runtime.win-x86.Microsoft.DotNet.Wpf.GitHub.5.0.0-ci.nupkg'.
2020-04-23T04:00:40.3376680Z Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.DotNet.Arcade.Wpf.Sdk.5.0.0-ci.nupkg'.
2020-04-23T04:00:41.1278940Z Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.DotNet.Wpf.GitHub.5.0.0-ci.nupkg'.
2020-04-23T04:00:42.2993941Z Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.DotNet.Wpf.ProjectTemplates.5.0.0-ci.nupkg'.
2020-04-23T04:00:43.0266336Z Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.NET.Sdk.WindowsDesktop.5.0.0-ci.nupkg'.
2020-04-23T04:00:45.5485389Z
2020-04-23T04:00:45.5486750Z Build succeeded.
2020-04-23T04:00:45.5488608Z 0 Warning(s)
2020-04-23T04:00:45.5489064Z 0 Error(s)
2020-04-23T04:00:45.5489325Z
2020-04-23T04:00:45.5921119Z Time Elapsed 00:05:29.82
也就是最简单的构建 WPF 的方法就是先 Fork 官方仓库到自己的仓库,将 WPF 代码 Clone 到本地,切换 commit 到 f226a72ed5302737b14984cffdd6208731244038 版本,切换 commit 可以使用下面 Git 命令
git checkout f226a72ed5302737b14984cffdd6208731244038
然后新建一个分支,使用 Git 命令如下
git checkout -b 分支名
复制本文上面的清单文件的代码,在相对于 .git
文件夹的 .github\workflows\
文件夹创建 dotnetcore.yml 文件,将上面的清单代码放入到 dotnetcore.yml 文件
使用 Git 创建 commit 或通过 VisualStudio 的团队管理创建 commit 推送到自己的 Fork 的仓库里面,此时将会触发 GitHub 的 Action 的自动构建
在构建完成的 WPF 的输出是 NuGet 包,在 artifacts\packages
文件夹
在构建成功之后,还请小伙伴试试切换 WPF 的源代码到最新,尝试构建一下
本地构建的方法相对来说比较复杂,虽然从上面的清单文件可以看到,其实构建的代码只有调用脚本一句话。但是本地需要先让环境搭建,如让 VisualStudio 安装全部功能等
本地构建的方法如下
先打开 VisualStudio 让 VisualStudio 安装全部的功能,特别是 C++ 的全部勾选
保持本地是系统是 Windows 10 最新版本
下载 Download the Windows Driver Kit (WDK) 安装,我不确定这是不是必须的
搭建好梯子,设置全局代理
通过 PowerShell 执行 .\build.cmd
脚本,注意此时不要添加任何后缀,这样将可以在输出信息里面快速知道是不是下载失败了
如果下载失败了,将会提示如解压缩失败等,此时请清空自己的系统临时文件夹,用户临时文件夹,和 .netcoreeng
文件夹。这里的 .netcoreeng
放在用户文件夹,如 C:\Users\lindexi\.netcoreeng\
文件夹。清空 NuGet 缓存文件夹。调用 git clean -xdf
清空代码文件
可以通过梯子的输出找到当前需要下载的文件的链接,可以尝试做本地的代理,先用其他方式下载然后用 Fiddler 模拟路径提升下载速度
如果可以到输出下面代码,表示前面的下载工具应该完成
LINK : fatal error LNK1104: cannot open file 'MSVCURTD_netcore.LIB' [D:\a\wpf\wpf\src\Microsoft.DotNet.Wpf\src\DirectWriteForwarder\DirectWriteForwarder.vcxproj]
上面代码是因为没有指定 x86 的方式构建,在命令行运行 .\build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86
尝试构建
如果还是失败了,可以多次尝试上面的命令,先不要做任何的清理。或者先调用git clean -xdf
清理一下,然后继续调用上面命令
大概在尝试很多次,应该可以构建成功,之后就可以愉快打开 VisualStudio 了,在里面单独构建某个项目了。当然也不是所有的项目都能成功构建
在调用上面的脚本的命令里面,其实还有以下的调用方法,分别是进行 x86 和 x64 的构建,以及进行 Debug 和 Release 的构建
build.cmd -pack -ci -configuration $(Configuration) -prepareMachine /p:Platform=$(Platform)
请将上面代码的 $(Configuration)
替换为 Debug 或 Release 将 $(Platform)
替换为 x86 或 x64 进行构建
如果能生成官方的构建 ID 可以在命令行添加下面参数 /p:OfficialBuildId=$(BuildId)
这里的 BuildId
在官方仓库里面用的是 $(BUILD.BUILDNUMBER)
这是在 Azure Pipelines 的参数,大概的值的是 20190909.1
这样的值,可以自己随意给
上面参数的 -ci
是 arcade 提供的功能,用来启动 CI 构建
能构建官方开源代码就可以作出自己私有的版本,在使用上面命令构建完成之后,可以在 artifacts\packages
文件夹找到构建的 NuGet 包,这些文件可以私有发布,或者自己修改 Id 发布
现在微软的开源协议非常友好,允许小伙伴对源代码进行修改和发布
虽然可以进行自己的私有发布,当时我还是推荐将代码提到官方仓库,有官方的大佬帮忙看看代码是否合理。只要在官方的大佬认为代码不合理但是自己却觉得必须,或者官方发布太慢了,才使用自己的版本
原因是如果都用自己的版本,后续官方修了一些内容,将很难合并到自己的版本
手把手教你如何构建 WPF 官方开源框架源代码的更多相关文章
- 手把手教你如何搭建iOS项目基本框架
手把手教你如何搭建iOS项目基本框架 今天我们来谈谈如何搭建框架,框架需要做一些什么. 第一步:找到我们的目标我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题. 第二步:我们需要做 ...
- 手把手教你如何构建Vue前端组件库
在前端开发中可能会遇到将相同的功能模板集合成一个组件,供他人调用,这样可以减少重复造轮子,也可以节约人力.财力,更能够提高代码的可维护度:下面将通过详细的步骤教你如何构建一个Vue前端组件. 1.在本 ...
- 手把手教你从零开始搭建SpringBoot后端项目框架
原料 新鲜的IntelliJ IDEA.一双手.以及电脑一台. 搭建框架 新建项目 打开IDE,点击File -> New Project.在左侧的列表中的选择Maven项目,点击Next. 填 ...
- 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
- 手把手教你 基础 整合最优雅SSM框架:SpringMVC + Spring
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
- 手把手教你使用Rollup打包📦并发布自己的工具库🔧
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志
前言 不久前,因为需求的原因,需要实现一个操作日志.几乎每一个接口被调用后,都要记录一条跟这个参数挂钩的特定的日志到数据库.举个例子,就比如禁言操作,日志中需要记录因为什么禁言,被禁言的人的id和各种 ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- 手把手教你用 FastDFS 构建分布式文件管理系统
说起分布式文件管理系统,大家可能很容易想到 HDFS.GFS 等系统,前者是 Hadoop 的一部分,后者则是 Google 提供的分布式文件管理系统.除了这些之外,国内淘宝和腾讯也有自己的分布式文件 ...
- 手把手教你用vue-cli构建一个简单的路由应用
上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 开发环境搭建好之后,那么开始新添加一些页面,构建最基本的vue项目, ...
随机推荐
- 说说你对keep-alive的理解是什么?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.Keep-alive 是什么 keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM ke ...
- power quyer 批量合并同一文件夹下数据格式相同的Excel文件
一.需求描述:现在有一批数据格式相同的Excel文件需要把里面的内容合并到同一个Excel的一个sheet里面 二.新建一个叫数据汇总的Excel文件-数据-新建查询-从文件-选择数据存放的文件夹-然 ...
- vue3中使用simple-keyboard实现虚拟键盘(带中文切换数字键盘)
效果图 官网 simple-keyboard官网:https://hodgef.com/simple-keyboard/ 打不开的话请用魔法 不足 中文语言包支持度不够.不过自己可以找语言包替换 依赖 ...
- css实现按钮点击水波纹效果和两边扩散效果
废话少说,先上代码了,复制到html中即可使用 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> & ...
- [ROS串口通信]Serial库读入结构体
本文介绍使用c++中Serial库读入结构体: //例如,结构体定义如下: typedef struct __attribute__((packed)) { uint16_t team; /* 本身队 ...
- KingbaseES V8R6 集群运维案例 -- 自动故障转移失败处理
KingbaseES V8R6版本 数据库自动故障转移失败(Automatic Database Failover Fails) 适用于: KingbaseES V8R6 版本. repmgr配置信息 ...
- KingbaseES V8R6运维案例之---wal日志解析DDL操作
案例说明: 通过sys_waldump解析DDL操作,获取DDL操作的日志条目具体内容. 适用版本: KingbaseES V8R3/R6 一.DDL事务操作对应的wal日志文件 # 查看当前on ...
- Lab1:Xv6 and Unix utilities
Sleep功能 通过接受时间参数,调用system_call 指令 sleep实现该功能 #include "kernel/types.h" #include "kern ...
- 强!10.6K star,一款开源HTTP测试工具,适合新手,简单、容易上手!
大家好,我是狂师! 今天给大家推荐一款开源的HTTP测试工具:Hurl,相比curl.wget功能更强大,且更容易上手.很适用新手使用. 1.项目介绍 Hurl是一个使用Rust语言开发的命令行工具, ...
- [HAOI2007,P2216,BZOJ1047]理想的正方形单调队列解法
题目描述 有一个 \(a \times b\) 的整数组成的矩阵,现请你从中找出一个 \(n \times n\) 的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入格式 第一行为 \( ...