欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

手把手教你如何构建 WPF 官方开源框架源代码

程序员文章站 2022-03-08 12:21:09
从去年微软就将 WPF 开源了,差不多现在所有 WPF 的源代码都开源了。在学习框架的时候,我会做一些改动,期望能构建一个自己的版本进行测试。但是作为一个特别大的框架,想要构建跑起来可不是直接在 VisualStudio 里面点击一下运行就完成了,需要做很多的准备才可以。本文将一步步教你如何构建 W... ......

从去年微软就将 wpf 开源了,差不多现在所有 wpf 的源代码都开源了。在学习框架的时候,我会做一些改动,期望能构建一个自己的版本进行测试。但是作为一个特别大的框架,想要构建跑起来可不是直接在 visualstudio 里面点击一下运行就完成了,需要做很多的准备才可以。本文将一步步教你如何构建 wpf 框架源代码

我不敢说每个版本的 wpf 框架的源代码我都能构建,在 我构建成功的版本是这个 小伙伴可以尝试使用本文的方法,先切的这个 commit 按照我的方法来进行构建,成功了之后再做更新版本的尝试

阅读本文能让你了解如何构建wpf框架 https://github.com/dotnet/wpf源代码,但是不确保你一定能构建成功

构建 wpf 的步骤如下:

  1. 下载构建需要的依赖库
  2. 还原 nuget 包
  3. 按照顺序构建 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

没错,将这个清单文件放在清单文件夹里面,如 就可以让 wpf 构建起来

上面的清单文件也是最简单的让 wpf 构建的代码了,核心代码是 .\build.cmd -pack -ci -configuration release -preparemachine /p:platform=x86 通过这句代码就可以调用微软小伙伴写好的脚本进行构建

手把手教你如何构建 WPF 官方开源框架源代码

在日志里面看到输出构建了 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 到 版本,切换 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 是 提供的功能,用来启动 ci 构建

能构建官方开源代码就可以作出自己私有的版本,在使用上面命令构建完成之后,可以在 artifacts\packages 文件夹找到构建的 nuget 包,这些文件可以私有发布,或者自己修改 id 发布

现在微软的开源协议非常友好,允许小伙伴对源代码进行修改和发布

虽然可以进行自己的私有发布,当时我还是推荐将代码提到官方仓库,有官方的大佬帮忙看看代码是否合理。只要在官方的大佬认为代码不合理但是自己却觉得必须,或者官方发布太慢了,才使用自己的版本

原因是如果都用自己的版本,后续官方修了一些内容,将很难合并到自己的版本