https://missing.csail.mit.edu/
https://missing-semester-cn.g…
https://www.bilibili.com/vide…思否主页:https://segmentfault.com/u/wi…
笔记
元编程通常又指 用于操作程序的程序,讲座中探讨的更多是对于开发 流程。
构建零碎
“构建零碎”帮忙咱们执行一系列的“构建过程”。构建过程包含:指标(targets),依赖(dependencies),规定(rules)。您必须通知构建零碎您具体的构建指标,零碎的工作则是找到构建这些指标所须要的依赖,并依据规定构建所需的两头产物,直到最终目标被构建进去。
现实的状况下,如果指标的依赖没有产生改变,并且咱们能够从之前的构建中复用这些依赖,那么与其相干的构建规定并不会被执行。
make
是最罕用的构建零碎之一,您会发现它通常被装置到了简直所有基于 UNIX 的零碎中。make
的教程能够参考阮一峰的这篇文章:Make 命令教程。
其余常见的构建零碎 / 工具:
- C 与 C++:Cmake,能够参考 CMake 入门实战
- Java:Maven,Ant,Gradle
- 前端开发:Grunt,Gulp,Webpack
- Ruby:Rake
- Rust:Cargo
依赖治理
软件仓库
- Ubuntu:能够通过
apt
这个工具来拜访 Ubuntu 软件包仓库 - CentOS,Redhat:通过
yum
这个工具来拜访软件仓库 - Archlinux/Manjaro:通过
pacman
工具拜访 Archlinux 软件仓库和 Arch 用户软件仓库(AUR,Arch User Repository) - Ruby:通过
gem
工具拜访 RubyGems - Python:通过
pip
工具拜访 Pypi
版本号
不同我的项目所用的版本号其具体含意并不完全相同,然而一个绝对比拟罕用的规范是语义版本号,这种版本号具备不同的语义,它的格局是这样的:major.minor.patch(主版本号. 次版本号. 补丁号)。相干规定有:
- 如果新的版本没有扭转 API,请将补丁号递增;
- 如果您增加了 API 并且该改变是向后兼容的,请将次版本号递增;
- 如果您批改了 API 然而它并不向后兼容,请将主版本号递增。
这样做有很多益处,例如如果咱们的我的项目是基于您的我的项目构建的,那么只有最新版本的主版本号只有没变就是平安的,次版本号不低于之前咱们应用的版本即可。换句话说,如果我依赖的版本是 1.3.7
,那么应用1.3.8
、1.6.1
,甚至是1.3.0
都是能够的。如果版本号是 2.2.4
就不肯定能用了,因为它的主版本号减少了。
继续集成系统
继续集成,或者叫做 CI 是一种雨伞术语(umbrella term),它指的是那些“当您的代码变动时,主动运行的货色”,能够认为是一种云端构建零碎。
市场上有很多提供各式各样 CI 工具的公司,例如 Travis CI、Azure Pipelines 和 GitHub Actions。
它们应用办法大同小异:在代码仓库中增加一个文件(recipe),在其中编写规定,规定包含 events 和 actions。
最常见的规定是:如果有人提交代码,执行测试套。当这个事件被触发时,CI 提供方会启动一个(或多个)虚拟机,执行您制订的规定,并且通常会记录下相干的执行后果。您能够进行某些设置,这样当测试套失败时您可能收到告诉或者当测试全副通过时,您的仓库主页会显示一个徽标。
Github 还有一个保护依赖关系的 CI 工具 Dependabot。
GitHub Pages 是一个很好的例子。Pages 在每次 master
有代码更新时,会执行 Jekyll 博客软件,而后使您的站点能够通过某个 GitHub 域名来拜访。对于咱们来说这些事件太琐碎了,我当初咱们只须要在本地进行批改,而后应用 git 提交代码,公布到远端。CI 会主动帮咱们解决后续的事件。
测试
- 测试套(Test suite):所有测试的统称
- 单元测试(Unit test):一个“微型测试”,用于对某个封装的个性进行测试
- 集成测试(Integration test): 一个“宏观测试”,针对零碎的某一大部分进行,测试其不同的个性或组件是否能协同工作。
- 回归测试(Regression test):用于保障之前引起问题的 bug 不会再次出现
- 模仿(Mocking): 应用一个假的实现来替换函数、模块或类型,屏蔽那些和测试不相干的内容。例如,您可能会“模仿网络连接”或“模仿硬盘”
课后练习
习题 1
一些有用的 make 构建指标(例如本题用到了 phony)。
.PHONY: clean
clean:
git ls-files -o | xargs rm
# 这样还会删掉 gitignore 中的文件,例如一些编辑器配置文件
# 此题也能够这样做
# rm plot-*.png
# rm paper.pdf
习题 3
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
# Redirect output to stderr.
exec 1>&2
if (! make)
then
cat <<\EOF
Error: make failed.
Excuting 'make paper.pdf'.
EOF
make paper.pdf
exit 1
fi
习题 4
基于 GitHub Pages 创立任意一个能够主动公布的页面。增加一个 GitHub Action 到该仓库,对仓库中的所有 shell 文件执行 shellcheck
(办法之一)。
习题 5
构建属于您的 GitHub action,对仓库中所有的 .md
文件执行proselint
或 write-good
,在您的仓库中开启这一性能,提交一个蕴含谬误的文件看看该性能是否失效。