Solution-元编程
-
大多数的 makefiles 都提供了 一个名为 clean 的构建目标,这并不是说我们会生成一个名为 clean 的文件,而是我们可以使用它清理文件,让 make 重新构建。您可以理解为它的作用是“撤销”所有构建步骤。在上面的 makefile 中为 paper.pdf 实现一个 clean 目标。您需要构建 phony。您也许会发现 git ls-files 子命令很有用。其他一些有用的 make 构建目标可以在这里找到;
- 为了编译 LaTeX,首先需要安装 basictex(MacOS)
brew cask install basictex
- 编写 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
```bash 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文件
- 为了编译 LaTeX,首先需要安装 basictex(MacOS)
-
指定版本要求的方法很多,让我们学习一下 Rust 的构建系统 的依赖管理。大多数的包管理仓库都支持类似的语法。对于每种语法(尖号、波浪号、通配符、比较、乘积),构建一种场景使其具有实际意义;
-
Git 可以作为一个简单的 CI 系统来使用,在任何 git 仓库中的 .git/hooks 目录中,您可以找到一些文件(当前处于未激活状态),它们的作用和脚本一样,当某些事件发生时便可以自动执行。请编写一个 pre-commit 钩子,当执行 make 命令失败后,它会执行 make paper.pdf 并拒绝您的提交。这样做可以避免产生包含不可构建版本的提交信息;
- 修改
.git/hooks
目录下面的pre-commit.sample
文件并将其命名为pre-commit
if ! make ; then echo "build failed, commit rejected" exit 1 fi
- 修改
-
基于 GitHub Pages 创建任意一个可以自动发布的页面。添加一个 GitHub Action 到该仓库,对仓库中的所有 shell 文件执行 shellcheck(方法之一);
进入仓库的 action
页面,修改 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
执行 action 后,可能会出现错误 根据提示修改错误 重新执行 action
- 构建属于您的 GitHub action,对仓库中所有的 .md 文件执行 proselint 或 write-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
Licensed under CC BY-NC-SA.