建構產物與乾淨建構
建構的每一步都留下先前不存在的檔案:目的檔、最終的可執行檔、產生出來的標頭檔、日誌檔。建構產物,就是任何這類由建構產生的檔案,相對於你親手寫的原始碼檔。乾淨建構,則是先刪掉所有這些產物再重來,使下一次建構完全從原始碼重建、不留任何先前的殘餘。
區別在於輸入與輸出之間。你的原始碼、Makefile 與設定都是輸入——你撰寫並保留它們,通常納入版本控制。產物則是輸出——main.o、app、一個 build/ 目錄的內容——由執行建構從輸入衍生而來,且可以安心丟棄,因為建構能再生它們。乾淨建構做的正是這種丟棄:像 make clean 的指令移除產物,或在外置佈局下你乾脆刪掉整個 build 目錄;接著下一次建構就沒有過時的殘餘來擾亂它。這正是為什麼當某事行為莫名其妙時人們會說「試試乾淨建構」——它排除了某個過時產物被悄悄重用的可能。
為什麼重要:讓產物與原始碼分開,能保持你專案的整潔、讓產生的檔案不進版本控制、並使建構可重現。而乾淨建構正是那一整類臭蟲的標準解藥——當增量、以時間戳為基礎的邏輯被搞糊塗時:一個過時的目的檔、一次只做到一半的先前建構、一個被改名而舊產物仍滯留的檔案。它較慢(一切都重編),但它消除了一切疑慮,確保你執行的東西真的是從目前的原始碼重新建出來的。
產物與原始碼: 原始碼: main.c util.c Makefile (這些你寫的) 產物: main.o util.o app (這些建構造的) 乾淨建構: $ make clean # 刪掉產物 $ make # 從原始碼重建一切
產物由原始碼衍生而來、可被刪除;乾淨建構移除它們並從頭重建。
乾淨建構是建構因過時產物而行為失常時的標準修法,但它不會修好你實際程式碼裡的臭蟲——它只是排除建構本身過時的可能。產物一般也不該提交進版本控制。