ninja:一個簡單的構建方式|Linux 中國
導讀:ninja 的神奇之處在於,你不必使用一些混亂的構建語言,它們很難記住,因為你不經常使用它(比如?make)
本文字數:2615,閱讀時長大約:3分鐘
https://linux.cn/article-12798-1.html
作者:Julia Evans
譯者:geekpi
大家好!每隔一段時間,我就會發現一款我非常喜歡的新軟體,今天我想說說我最近喜歡的一款軟體:ninja!
增量構建很有用
我做了很多小項目,在這些項目中,我想設置增量構建。例如,現在我正在寫一本關於 bash 的雜誌,雜誌的每一頁都有一個.svg文件。我需要將 SVG 轉換為 PDF,我的做法是這樣的:
for i in *.svg
do
svg2pdf $i $i.pdf # or ${i/.svg/.pdf} if you want to get really fancy
done
這很好用,但是我的svg2pdf腳本有點慢(它使用 Inkscape),而且當我剛剛只更新了一頁的時候,必須等待 90 秒或者其他什麼時間來重建所有的 PDF 文件,這很煩人。
構建系統是讓人困惑的
在過去,我對使用make或bazel這樣的構建系統來做我的小項目一直很反感,因為bazel是個大而複雜的東西,而make對我來說感覺有點神秘。我真的不想使用它們中的任何一個。
所以很長時間以來,我只是寫了一個 bash 腳本或者其他的東西來進行構建,然後就認命了,有時候只能等一分鐘。
ninja 是一個極其簡單的構建系統
但ninja並不複雜!以下是我所知道的關於 ninja 構建文件的語法:創建一個rule和一個build:
rule有一個命令(command)和描述(description)參數(描述只是給人看的,所以你可以知道它在構建你的代碼時在做什麼)。
rule svg2pdf
command = inkscape $in --export-text-to-path --export-pdf=$out
description = svg2pdf $in $out
build的語法是build output_file: rule_name input_files。下面是一個使用svg2pdf規則的例子。輸出在規則中的$out里,輸入在$in里。
build pdfs/variables.pdf: svg2pdf variables.svg
這就完成了!如果你把這兩個東西放在一個叫build.ninja的文件里,然後運行ninja,ninja 會運行inkscape variables.svg --export-text-to-path --export-pdf=pdfs/variables.pdf。然後如果你再次運行它,它不會運行任何東西(因為它可以告訴你已經構建了pdfs/variables.pdf,而且是最新的)。
Ninja 還有一些更多的功能(見手冊),但我還沒有用過。它最初是為 Chromium構建的,所以即使只有一個小的功能集,它也能支持大型構建。
ninja 文件通常是自動生成的
ninja 的神奇之處在於,你不必使用一些混亂的構建語言,它們很難記住,因為你不經常使用它(比如make),相反,ninja 語言超級簡單,如果你想做一些複雜的事情,那麼你只需使用任意編程語言生成你想要的構建文件。
我喜歡寫一個build.py文件,或者像這樣的文件,創建 ninja 的構建文件,然後運行ninja:
with open("build.ninja", "w") as ninja_file:
# write some rules
ninja_file.write("""
rule svg2pdf
command = inkscape $in --export-text-to-path --export-pdf=$out
description = svg2pdf $in $out
""")
# some for loop with every file I need to build
for filename in things_to_convert:
ninja_file.write(f"""
build {filename.replace("svg", "pdf")}: svg2pdf {filename}
""")
# run ninja
import subprocess
subprocess.check_call(["ninja"])
我相信有一堆ninja的最佳實踐,但我不知道。對於我的小項目而言,我發現它很好用。
meson 是一個生成 ninja 文件的構建系統
我對Meson還不太了解,但最近我在構建一個 C 程序 (plocate,一個比locate更快的替代方案)時,我注意到它有不同的構建說明,而不是通常的./configure; make; make install:
meson builddir
cd builddir
ninja
看起來 Meson 是一個可以用 ninja 作為後端的 C/C /Java/Rust/Fortran 構建系統。
就是這些!
我使用 ninja 已經有幾個月了。我真的很喜歡它,而且它幾乎沒有給我帶來讓人頭疼的構建問題,這讓我感覺非常神奇。
via:https://jvns.ca/blog/2020/10/26/ninja--a-simple-way-to-do-builds/
作者:Julia Evans選題:lujun9972譯者:geekpi校對:wxy
本文由LCTT原創編譯,Linux中國榮譽推出