MIT-Missing-Semester8: Metaprogramming

A. Lecture Notes: Metaprogramming

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

大多数大型软件项目都附带了“测试套件”。您可能已经熟悉了测试的一般概念,一些简单的、可能遇到的测试术语:

  • 测试套件:所有测试的统称
  • 单元测试:一种单独测试特定功能的“微测试”
  • 集成测试:一种“宏测试”,运行系统的大部分,以检查不同的功能或组件是否协同工作。
  • 回归测试:实现以前导致错误的特定模式的测试,以确保错误不会再次出现。
  • 模拟:用假实现替换函数、模块或类型,以避免测试无关的功能。例如,您可以“模拟网络”或“模拟磁盘”。

B. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值