Wilhel

Wilhel

元編程

构建系统#

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

依賴管理#

持續整合系統#

課後練習#

習題解答

  1. 大多數的 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檔案
    
    
  2. 指定版本要求的方法很多,讓我們學習一下 Rust 的構建系統 的依賴管理。大多數的包管理倉庫都支持類似的語法。對於每種語法 (尖號、波浪號、通配符、比較、乘積),構建一種場景使其具有實際意義;

  3. Git 可以作為一個簡單的 CI 系統來使用,在任何 git 倉庫中的 .git/hooks 目錄中,您可以找到一些檔案(當前處於未激活狀態),它們的作用和腳本一樣,當某些事件發生時便可以自動執行。請編寫一個 pre-commit 鉤子,它會在提交前執行 make paper.pdf並在出現構建失敗的情況拒絕您的提交。這樣做可以避免產生包含不可構建版本的提交信息;

  4. 基於 GitHub Pages 創建任意一個可以自動發布的頁面。添加一個GitHub Action 到該倉庫,對倉庫中的所有 shell 檔案執行 shellcheck(方法之一);

  5. 構建屬於您的 GitHub action,對倉庫中所有的.md檔案執行proselintwrite-good,在您的倉庫中開啟這一功能,提交一個包含錯誤的檔案看看該功能是否生效。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。