一日一技:5分鐘掌握 Makefile

      網友投稿 1156 2025-03-31

      在前幾天的文章:一日一技:為 Python 項目編寫 Makefile一文中,我們講到了 Makefile。這幾天不少同學在公眾號后臺留言,想進一步了解如何編寫 Makefile。于是,就有了今天這篇文章。


      如果你現在使用 macOS 或者 Linux,那么你可以在終端輸入命令man make,查看make命令的幫助文檔,如下圖所示:

      通過make命令,你可以快速運行一大段 Shell 命令,從而實現一鍵編譯代碼,一鍵格式化代碼等等功能。

      要學習 Makefile,你需要有一個Linux 或者 macOS,然后需要知道兩個概念:make命令和Makefile文件。其中,Makefile文件是你自己寫的一個文本文件,它的名字叫做Makefile,不能修改大小寫,只能叫這個名字。而make是 macOS 和 Linux 中自帶的一個命令。當我們執行make命令的時候,它自動讀取Makefile文件,從而決定自己要做什么事情。

      我們來看一個實際例子。下圖為一段很簡單的 Golang 代碼:

      代碼里面,有一些逗號后面沒有空格,結構體也寫得參差不齊。當我們要格式化一個.go文件的時候,一般是在當前文件夾下面執行命令:

      gofmt -w xxx.go

      運行以后,如下圖所示:

      你為了執行這個命令,你需要敲15次鍵盤。而且如果你的項目里面有很多個.go文件,并且他們位于不同的文件夾里面,那么你還需要執行命令:

      find . -name "*.go" | xargs gofmt -w

      要敲的鍵盤就更多了。

      這個時候,我們可以在項目根目錄創建一個Makefile文件,其內容如下:

      fmt: find . -name "*.go" | xargs gofmt -w

      如下圖所示:

      于是,當我們在項目根目錄執行命令:make fmt的時候,整個項目里面的所有.go文件都會被自動格式化。

      Makefile文件的格式如下:

      名字1: shell 命令1 shell 命令2 shell 命令3 名字2: shell 命令4 shell 命令5 shell 命令6

      一日一技:5分鐘掌握 Makefile

      其中,名字1?名字2用于執行命令make 名字,每一個名字下面可以跟很多條 Shell 命令。這里看起來有點像是 Python 的縮進。但需要特別注意的是,Makefile 的縮進只能使用 Tab 鍵,不能使用空格。

      我們再來舉個例子,現在,我需要把項目編譯生成一個可執行文件,然后把這個可執行文件連同data.json一起復制到 一個叫做?output?的文件夾中。那么,我們的 Makefile 可以這樣寫:

      fmt: gofmt -w *.go build: rm -rf output mkdir output go build -o JsonReader main.go mv JsonReader ./output/ cp data.json ./output/

      然后,當我們執行命令make build的時候,它下面的5行命令就一次性自動執行了。

      再來一個例子,可能有一些程序開發完成以后,需要在本地 Docker 環境里面運行。但是如果已經有一個同名容器在運行了,我們必須先停止容器,刪除容器,然后才能重新運行。但是如果有了 Makefile,這也就是一行命令的事情:

      deploy: docker build -t xxx:latest docker stop json_reader docker rm json_reader docker run --name json_reader --network host -d xxx:latest

      除此之外,Makefile 還支持串聯多個名字下面的 shell 命令。例如,我想先格式化代碼,然后編譯成可執行文件,最后再使用 Docker 部署,那么,我們最終的 Makefile 文件如下圖所示:

      此時,我只需要在項目根目錄中執行命令make,不帶任何參數,那么,fmt、build和deploy下面的所有 Shell 命令都會按順序依次執行。從而大大減少了我們的工作量。

      可以說,無論是 Golang 項目還是 Python 還是其他項目,使用 Makefile 來自動化執行一些繁瑣重復的命令,是一個一勞永逸的事情。

      Makefile Shell

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel中函數IF公式大全 - 讓你輕松掌握Excel中的IF函數
      下一篇:【云端大事件】耕云設備健康云入駐華為云市場,助力企業設備管理降本增效
      相關文章
      国产精品亚洲一区二区三区在线| 亚洲成a人片在线观看老师| 亚洲M码 欧洲S码SSS222| 亚洲精品美女久久久久| 亚洲区小说区图片区QVOD| 亚洲精品无码99在线观看| 亚洲av无码乱码在线观看野外| 久久久久亚洲精品无码网址色欲| 学生妹亚洲一区二区| 亚洲色大成网站WWW国产| 亚洲精品国产av成拍色拍| 亚洲字幕AV一区二区三区四区| 伊人久久五月丁香综合中文亚洲| 亚洲中文久久精品无码1| 亚洲人成免费电影| 亚洲妇女熟BBW| 亚洲日韩av无码中文| 亚洲第一成年网站视频| 老子影院午夜伦不卡亚洲| 少妇亚洲免费精品| 国产午夜亚洲精品不卡电影| 四虎亚洲国产成人久久精品| 亚洲人成网站色在线入口| 丁香五月亚洲综合深深爱| 国产亚洲欧洲精品| 久久精品国产亚洲香蕉| 久久亚洲国产成人精品性色| 亚洲宅男天堂a在线| 自拍日韩亚洲一区在线| 亚洲狠狠婷婷综合久久蜜芽| 亚洲AV无码专区日韩| 国产亚洲一区二区三区在线不卡| 亚洲精品你懂的在线观看 | 亚洲av最新在线网址| 亚洲av鲁丝一区二区三区| 亚洲狠狠ady亚洲精品大秀| 亚洲人成网站看在线播放| 亚洲第一第二第三第四第五第六| 亚洲国产精品日韩| 亚洲日产韩国一二三四区| 无码专区—VA亚洲V天堂|