乐趣区

关于linux:计算机教育中缺失的一课-MIT-L8-元编程

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.81.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 文件执行proselintwrite-good,在您的仓库中开启这一性能,提交一个蕴含谬误的文件看看该性能是否失效。

退出移动版