A. Lecture Notes: Course overview
Build systems
依赖的库的版本。
对于8.1.4,三个数字分别表示:major、minor、patch
加功能:major
添加库:minor
安全修补:patch
lock文件用于冻结版本。
持续集成系统,会有budge的显示,显示了:
版本号、测试的覆盖、依赖。
cmake:编c
maven:java
在最顶层用make。
遇到要求不同的版本号的c时,则编译会失败。需要升级b,以依赖和a相同版本号的c。
A brief aside on testing
大多数大型软件项目都附带了“测试套件”。您可能已经熟悉了测试的一般概念,一些简单的、可能遇到的测试术语:
- 测试套件:所有测试的统称
- 单元测试:一种单独测试特定功能的“微测试”
- 集成测试:一种“宏测试”,运行系统的大部分,以检查不同的功能或组件是否协同工作。
- 回归测试:实现以前导致错误的特定模式的测试,以确保错误不会再次出现。
- 模拟:用假实现替换函数、模块或类型,以避免测试无关的功能。例如,您可以“模拟网络”或“模拟磁盘”。
Exercises
1、大多数makefile都提供了一个名为clean的目标。这不是为了生成一个名为clean的文件,而是为了清理任何可以通过make重建的文件。将其视为“撤消”所有构建步骤的一种方式。为上面的paper.pdf Makefile实现一个干净的目标。你必须让目标变得虚假。您可能会发现git ls-files子命令很有用。这里列出了许多其他非常常见的make目标。
Makefile:
# 定义变量
TEX = paper.tex
PDF = paper.pdf
PLOT_DATA = plot-data.png
AUX_FILES = $(TEX:.tex=.aux) $(TEX:.tex=.log) $(TEX:.tex=.out) $(TEX:.tex=.toc)
# 默认目标: 生成 paper.pdf
all: $(PDF)
# 生成 paper.pdf
$(PDF): $(TEX) $(PLOT_DATA)
pdflatex $(TEX)
# paper.pdf: paper.tex plot-data.png
# pdflatex paper.tex
# 生成图表
plot-%.png: %.dat plot.py
./plot.py -i $*.dat -o $@
# 清理目标
.PHONY: clean
clean:
-@rm -f $(PDF) $(PLOT_DATA) $(AUX_FILES)
-@git clean -Xdf
# 其他常见的Makefile目标
# 查看PDF文件
.PHONY: view
view: $(PDF)
xdg-open $(PDF)
.PHONY: help
help:
@echo "Available targets:"
@echo " all - Build the paper (default)"
@echo " clean - Clean up generated files"
@echo " view - View the generated PDF"
@echo " help - Show this help message"
~
2、看看在Rust的构建系统中为依赖项指定版本要求的各种方法。大多数包存储库支持类似的语法。对于每一个(插入符号、波浪号、通配符、比较和倍数),试着想出一个用例,在这个用例中,这种特定的需求是有意义的。
略
3、Git本身可以作为一个简单的CI系统。在任何git存储库中的.git/hocks中,您都可以找到在发生特定操作时作为脚本运行的(当前处于非活动状态)文件。编写一个预提交钩子,运行make paper.pdf,如果make命令失败,则拒绝提交。这应该可以防止提交中有无法构建的论文版本。
进入./git/hooks,新建pre-commit。代码:
#!/bin/bash
# 输出提示信息
echo "Running 'make paper.pdf' to ensure the paper can be built..."
# 运行 make paper.pdf
make paper.pdf
# 检测 make 命令的退出状态
if [ $? -ne 0 ]; then
echo "Error: 'make paper.pdf' failed. Please fix the build and try again."
exit 1
fi
# 如果 make 成功,允许提交
echo "Build successful, procedding with commit."
exit 0
4、设置一个简单的自动发布的 GitHub Pages 页面,并添加一个 GitHub Action 来运行 shellcheck 检查仓库中的所有 shell 文件。
在仓库页面的顶部菜单栏中,点击 Settings 选项卡->
在 Settings 页面中,向下滚动找到 GitHub Pages 部分->
在 GitHub Pages 部分,选择发布源为 master 分支。
仓库中创建 .github/workflows 目录:
$ mkdir -p .github/workflows
在 .github/workflows 目录下创建一个名为 shellcheck.yml 的文件,并添加以下内容:
name: ShellCheck
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
shellcheck:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Run ShellCheck
run: |
sudo apt-get update
sudo apt-get install -y shellcheck
find . -name "*.sh" -exec shellcheck {} \;
提交并推送更改:
$ git add .github/workflows/shellcheck.yml
$ git commit -m "Add GitHub Action for shellcheck"
$ git push origin main
5、构建自己的GitHub操作来运行proselint或在存储库中的所有.md文件上编写良好。在您的存储库中启用它,并通过提交一个有拼写错误的拉取请求来检查它是否正常工作。
在 .github/workflows 目录下创建一个名为 markdown-lint.yml 的文件,并添加以下内容:
name: Markdown Lint
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
markdown-lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install proselint
run: |
pip install proselint
- name: Run proselint
run: |
find . -name "*.md" -exec proselint {} \;
参考:
1、MIT-Missing-Semester。