构建系统#
make
是最常用的构建系统之一,您会发现它通常被安裝到了幾乎所有基於 UNIX 的系統中。make
並不完美,但是對於中小型專案來說,它已經足夠好了。當您執行 make
時,它會去參考當前目錄下名為 Makefile
的文件。
paper.pdf: paper.tex plot-data.png
pdflatex paper.tex
plot-%.png: %.dat plot.py
./plot.py -i $*.dat -o $@
冒號左側的是構建目標,冒號右側的是構建它所需的依賴。縮進的部分是從依賴構建目標時需要用到的一段程式。在 make
中,第一條指令還指明了構建的目的,如果您使用不帶參數的 make
,這便是我們最終的構建結果。或者,您可以使用這樣的命令來構建其他目標:make plot-data.png
。
$ cat paper.tex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[scale=0.65]{plot-data.png}
\end{document}
$ cat plot.py
#!/usr/bin/env python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', type=argparse.FileType('r'))
parser.add_argument('-o')
args = parser.parse_args()
data = np.loadtxt(args.i)
plt.plot(data[:, 0], data[:, 1])
plt.savefig(args.o)
$ cat data.dat
1 1
2 2
3 3
4 4
5 8
依賴管理#
持續整合系統#
課後練習#
-
大多數的 makefiles 都提供了一個名為
clean
的構建目標,這並不是說我們會生成一個名為clean
的檔案,而是我們可以使用它清理檔案,讓 make 重新構建。您可以理解為它的作用是 “撤銷” 所有構建步驟。在上面的 makefile 中為paper.pdf
實現一個clean
目標。您需要將構建目標設置為 phony。您也許會發現git ls-files
子命令很有用。其他一些有用的 make 構建目標可以在這裡找到;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 ~$ 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檔案
-
指定版本要求的方法很多,讓我們學習一下 Rust 的構建系統 的依賴管理。大多數的包管理倉庫都支持類似的語法。對於每種語法 (尖號、波浪號、通配符、比較、乘積),構建一種場景使其具有實際意義;
-
Git 可以作為一個簡單的 CI 系統來使用,在任何 git 倉庫中的
.git/hooks
目錄中,您可以找到一些檔案(當前處於未激活狀態),它們的作用和腳本一樣,當某些事件發生時便可以自動執行。請編寫一個pre-commit
鉤子,它會在提交前執行make paper.pdf
並在出現構建失敗的情況拒絕您的提交。這樣做可以避免產生包含不可構建版本的提交信息; -
基於 GitHub Pages 創建任意一個可以自動發布的頁面。添加一個GitHub Action 到該倉庫,對倉庫中的所有 shell 檔案執行
shellcheck
(方法之一); -
構建屬於您的 GitHub action,對倉庫中所有的
.md
檔案執行proselint
或write-good
,在您的倉庫中開啟這一功能,提交一個包含錯誤的檔案看看該功能是否生效。