Linux中國

ninja:一個簡單的構建方式

大家好!每隔一段時間,我就會發現一款我非常喜歡的新軟體,今天我想說說我最近喜歡的一款軟體: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 文件,這很煩人。

構建系統是讓人困惑的

在過去,我對使用 makebazel 這樣的構建系統來做我的小項目一直很反感,因為 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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國