Solution-元编程

1. 大多数的 makefiles 都提供了 一个名为 clean 的构建目标,这并不是说我们会生成一个名为clean的文件,而是我们可以使用它清理文件,让 make 重新构建。您可以理解为它的作用是“撤销”所有构建步骤。在上面的 makefile 中为paper.pdf实现一个clean 目标。您需要构建phony。您也许会发现 git ls-files 子命令很有用。其他一些有用的 make 构建目标可以在这里找到;

1. 为了编译 LaTeX,首先需要安装 basictex(MacOS)

brew cask install basictex

2. 编写 Makefile

paper.pdf: paper.tex plot-data.png
	pdflatex paper.tex

plot-%.png: %.dat plot.py
	./plot.py -i $*.dat -o $@

.PHONY: clean
clean:
	rm *.pdf *.aux *.log *.png
	#git ls-files -o | xargs rm -f
git ls-files -o | xargs rm -f 

可以列出没有被 git 追踪的文件,一般是构建的中间产物,当然,需要首先设置 git 的忽略规则。

下面展示另一种清理git仓库的思路(将所有untracked文件移动到Untrack目录下):

~$ cat makefile
paper.pdf: paper.tex plot-data.png
  pdflatex paper.tex

plot-%.png: %.dat plot.py
  ./plot.py -i $*.dat -o $@

.phony: clean
clean:
  mkdir -p Untrack
  rm -f *~ .*~
  git ls-files -o | grep -v Untrack | xargs -r mv -u -t Untrack

~$ cat .gitignore
Untrack
# 设置git忽略该目录,用来放置untracked文件

2. 指定版本要求的方法很多,让我们学习一下 Rust的构建系统的依赖管理。大多数的包管理仓库都支持类似的语法。对于每种语法(尖号、波浪号、通配符、比较、乘积),构建一种场景使其具有实际意义;

3. Git 可以作为一个简单的 CI 系统来使用,在任何 git 仓库中的 .git/hooks 目录中,您可以找到一些文件(当前处于未激活状态),它们的作用和脚本一样,当某些事件发生时便可以自动执行。请编写一个pre-commit 钩子,当执行make命令失败后,它会执行 make paper.pdf 并拒绝您的提交。这样做可以避免产生包含不可构建版本的提交信息;

1. 修改.git/hooks 目录下面的pre-commit.sample文件并将其命名为pre-commit

if  ! make ; then
     echo "build failed, commit rejected"
     exit 1
fi

1.png

4. 基于 GitHub Pages 创建任意一个可以自动发布的页面。添加一个GitHub Action 到该仓库,对仓库中的所有 shell 文件执行 shellcheck(方法之一);

1.png 1.png 进入仓库的 action 页面,修改blank.yml 1.png

# This is a basic workflow to help you get started with Actions

name: CI
...
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2
      # run shellcheck
      - name: ShellCheck
        uses: ludeeus/action-shellcheck@1.1.0

执行 action 后,可能会出现错误 1.png 根据提示修改错误 1.png 重新执行 action 1.png

5. 构建属于您的 GitHub action,对仓库中所有的.md文件执行 proselintwrite-good,在您的仓库中开启这一功能,提交一个包含错误的文件看看该功能是否生效。

在 Github marketplace 中,可以找到,Lint Markdown

修改blank.yml

# This is a basic workflow to help you get started with Actions

name: CI
...
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2
      # run shellcheck
      - name: ShellCheck
        uses: ludeeus/action-shellcheck@1.1.0
      - name: Post comment
        uses: mshick/add-pr-comment@v1
        if: $
        with:
            message: |
            $
            repo-token: $
            repo-token-user-login: 'github-actions[bot]' # The user.login for temporary GitHub tokens
            allow-repeats: false # This is the default

Edit this page.

Licensed under CC BY-NC-SA.